można użyć 'u' modyfikator z PCRE regex; patrz Pattern Modifiers (cytowanie)
U (PCRE8)
Modyfikator włącza dodatkowe funkcjonalności PCRE, który jest niezgodny z Perl. Wzorce są traktowane jako UTF-8. Ten modyfikator jest dostępny z PHP 4.1.0 lub nowszego na Unixie iz PHP 4.2.3 na win32. Poprawność UTF-8 wzorca jest sprawdzana od czasu PHP 4.3.5.
Na przykład, biorąc pod uwagę ten kod:
header('Content-type: text/html; charset=UTF-8'); // So the browser doesn't make our lives harder
$str = "abc 文字化け, efg";
$results = array();
preg_match_all('/./', $str, $results);
var_dump($results[0]);
dostaniesz bezużyteczny wynik:
array
0 => string 'a' (length=1)
1 => string 'b' (length=1)
2 => string 'c' (length=1)
3 => string ' ' (length=1)
4 => string '�' (length=1)
5 => string '�' (length=1)
6 => string '�' (length=1)
7 => string '�' (length=1)
8 => string '�' (length=1)
9 => string '�' (length=1)
10 => string '�' (length=1)
11 => string '�' (length=1)
12 => string '�' (length=1)
13 => string '�' (length=1)
14 => string '�' (length=1)
15 => string '�' (length=1)
16 => string ',' (length=1)
17 => string ' ' (length=1)
18 => string 'e' (length=1)
19 => string 'f' (length=1)
20 => string 'g' (length=1)
Ale z tym kodem:
header('Content-type: text/html; charset=UTF-8'); // So the browser doesn't make our lives harder
$str = "abc 文字化け, efg";
$results = array();
preg_match_all('/./u', $str, $results);
var_dump($results[0]);
(Zwróć uwagę na "u" na końcu wyrażenia regularnego)
dostać to, co chcesz:
array
0 => string 'a' (length=1)
1 => string 'b' (length=1)
2 => string 'c' (length=1)
3 => string ' ' (length=1)
4 => string '文' (length=3)
5 => string '字' (length=3)
6 => string '化' (length=3)
7 => string 'け' (length=3)
8 => string ',' (length=1)
9 => string ' ' (length=1)
10 => string 'e' (length=1)
11 => string 'f' (length=1)
12 => string 'g' (length=1)
Nadzieja to pomaga :-)
Czy zdajesz sobie sprawę, że porównywanie znaków Unicode jest nietrywialne, w zależności od rodzaju porównania, jakiego chcesz? Np. Można wpisać ü jako U + 00DC lub U + 0075 U + 0308. – derobert
Tak, zdaję sobie z tego sprawę. Jeśli stanie się to problemem, będę musiał przekształcić dane wejściowe na jedną z normalnych formularzy Unicode przed podziałem. – joeforker