2013-07-03 59 views
3

我必須對日文文本使用explode()函數,但它不起作用。對日文字符串爆炸()

這裏是我有什麼

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

,打印

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

代替

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

似乎explode()無法識別內部的空間爲例文本。

是什麼原因?我怎麼能使它工作?

+0

爲什麼會有之間的 「イタリア」 和一個空格「人「? –

+0

我知道イタリア和人應該放在一起,但我需要把他們作爲分離的實體。 – Alhazred

回答

0

這是因爲你在這裏沒有空格字符的簡單原因。 您有一個帶有十六進制代碼「e3 80 80」的「IDEOGRAPHIC SPACE」字符。

如果您使用它作爲您的分隔符,它將起作用。

+0

謝謝,我已經改變了空間,現在它工作 – Alhazred

0

首先使用iconv()轉換字符串,然後在爆炸時使用它。轉換爲utf8

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

轉換爲什麼? –

+0

轉換爲utf-8 – DevZer0

0

除了簡單的ASCII空格之外,還有許多字符可以在字符之間添加空格。

您可以嘗試使用\ s(空格字符)或\ b(單詞邊界)作爲模式使用preg_split,但這可能並不理想,因爲日語幾乎肯定會以多字節格式編碼。

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));