@@ -81,17 +81,20 @@ public function ascii(array $rules = []): self
8181 $ s = $ str ->string ;
8282 $ str ->string = '' ;
8383
84- $ rules [] = 'nfkd ' ;
85- $ rules [] = '[:nonspacing mark:] remove ' ;
84+ if (!$ rules ) {
85+ $ rules [] = '[:nonspacing mark:] remove ' ;
86+ }
87+
88+ array_unshift ($ rules , 'nfd ' );
8689
8790 if (\function_exists ('transliterator_transliterate ' )) {
8891 $ rules [] = 'any-latin/bgn ' ;
8992 $ rules [] = 'nfkd ' ;
9093 $ rules [] = '[:nonspacing mark:] remove ' ;
9194 }
9295
93- while (\strlen ($ s ) !== $ i = strspn ($ s , self ::ASCII )) {
94- if (0 !== $ i ) {
96+ while (\strlen ($ s ) - 1 > $ i = strspn ($ s , self ::ASCII )) {
97+ if (0 < -- $ i ) {
9598 $ str ->string .= substr ($ s , 0 , $ i );
9699 $ s = substr ($ s , $ i );
97100 }
@@ -106,10 +109,10 @@ public function ascii(array $rules = []): self
106109 continue ;
107110 }
108111
109- if ('nfkd ' === $ rule = strtolower ($ rule )) {
110- if (! normalizer_is_normalized ($ s , self ::NFKD )) {
111- $ s = normalizer_normalize ( $ s , self :: NFKD );
112- }
112+ if ('nfd ' === $ rule = strtolower ($ rule )) {
113+ normalizer_is_normalized ($ s , self ::NFD ) ?: $ s = normalizer_normalize ( $ s , self :: NFD );
114+ } elseif ( ' nfkd ' === $ rule ) {
115+ normalizer_is_normalized ( $ s , self :: NFKD ) ?: $ s = normalizer_normalize ( $ s , self :: NFKD );
113116 } elseif ('[:nonspacing mark:] remove ' === $ rule ) {
114117 $ s = preg_replace ('/\p{Mn}++/u ' , '' , $ s );
115118 } elseif ('de-ascii ' === $ rule ) {
0 commit comments