2013-07-03 4 views
3

Мне нужно использовать функцию explode() по японскому тексту, но она не работает.Взрыв() на японской струне

Вот пример того, что у меня есть

$string = '私 は イタリア 人 です'; 
$string = explode(" ", $string); 
print_r($string); 

Это печатает

Array ([0] => 私 は イタリア 人 です) 

вместо

Array ([0] => 私 [1] => は [2] => イタリア [3] => 人 [4] => です) 

Это кажется, что explode() не может распознать пространства внутри, что текст.

В чем причина? Как я могу заставить его работать?

+0

Почему пространство между "イ タ リ ア" и «人«? –

+0

Я знаю, что イ タ リ ア и 人 должны быть собраны вместе, но мне нужно принять их как отделенные объекты. – Alhazred

ответ

0

Это по той простой причине, что здесь у вас нет символа пробела. У вас есть символ «IDEOGRAPHIC SPACE» с шестнадцатеричным кодом «e3 80 80».

Если вы используете это как свой разделитель, он будет работать.

+0

Спасибо, я изменил пространство, и теперь он работает – Alhazred

0

конвертируйте свою строку сначала с помощью iconv(), а затем используйте ее для взрыва. Конвертировать в utf8

$string = explode(" ", iconv('', 'utf-8', $string)); 
+2

Конвертировать в какую? –

+0

конвертировать в utf-8 – DevZer0

0

Существует множество символов, кроме простого пространства ASCII, которое может добавлять пробелы между символами.

Вы можете попробовать использовать preg_split с использованием \ s (пробельные символы) или \ b (границы слов) в качестве шаблона, однако это может быть не идеальным, поскольку японский язык почти наверняка будет кодироваться в многобайтовом формате.

4

Вы используете неправильное пространство. В тексте используются пробелы полной ширины (U + 3000 IDEOGRAPHIC SPACE), и вы предоставляете пространство полуширины (U + 0020 SPACE).

1

Здесь есть две проблемы.

Прежде всего, вы не говорите, что такое ваша кодировка, но я полагаю, что все японские кодировки являются многобайтовыми. С другой стороны, explode() function (как и все обычные функции 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)); 
Смежные вопросы