Я должен использовать функцию explode () в японском тексте, но это не работает.
Вот пример того, что у меня есть
$string = '私 は イタリア 人 です'; $string = explode(" ", $string); print_r($string);
Это печатает
Array ( [0] => 私 は イタリア 人 です )
на месте
Array ( [0] => 私 [1] => は [2] => イタリア [3] => 人 [4] => です )
Кажется, что explode()
не может распознать пробелы внутри этого текста.
В чем причина? Как я могу заставить его работать?
Это по той простой причине, что здесь у вас нет космического символа. У вас есть символ «IDEOGRAPHIC SPACE» с шестнадцатеричным кодом «e3 80 80».
Если вы используете это как ваш разделитель, он будет работать.
Вы используете неправильное пространство. В тексте используются пробелы полной ширины (U + 3000 IDEOGRAPHIC SPACE), и вы предоставляете пространство полуширины (U + 0020 SPACE).
Здесь есть два вопроса.
Прежде всего, вы не говорите, что такое ваша кодировка, но я полагаю, что все японские кодировки являются многобайтовыми. С другой стороны, функция explode()
(как и все обычные функции PHP) ожидает однобайтового ввода. Точного многобайтового эквивалента нет, но mb_split () может сделать трюк.
Во-вторых, вы взрываете обычное пространство ( U + 0020 ), но ваша строка содержит другой символ ( U + 3000 ).
Подводя итог (и предполагая, что вы используете UTF-8):
<?php mb_internal_encoding('UTF-8'); mb_regex_encoding('UTF-8'); $string = '私 は イタリア 人 です'; print_r(mb_split(' ', $string));
… или даже лучше:
<?php mb_internal_encoding('UTF-8'); mb_regex_encoding('UTF-8'); $string = '私 は イタリア 人 です'; print_r(mb_split('[[:space:]]', $string));
сначала конвертируйте свою строку с помощью iconv()
а затем используйте ее при взорвании. Преобразовать в utf8
$string = explode(" ", iconv('', 'utf-8', $string));
Существует несколько символов, отличных от простого пространства ASCII, которое может добавлять пробелы между символами.
Вы можете попробовать использовать preg_split, используя \ s (символы пробелов) или \ b (границы слов) в качестве шаблона, однако это может быть не идеальным, поскольку японский язык почти наверняка будет кодироваться в многобайтовом формате.