日语字符串上的explode()

时间:2013-07-03 08:51:59

标签: php string delimiter

我必须在日文文本上使用explode()函数,但它不起作用。

以下是我所拥有的一个例子

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

打印

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

取代

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

似乎explode()无法识别该文本中的空格。

是什么原因?我怎么能让它发挥作用?

5 个答案:

答案 0 :(得分:4)

你使用的是错误的空间。该文本使用全宽空格(U + 3000 IDEOGRAPHIC SPACE),并且您提供半宽空间(U + 0020 SPACE)。

答案 1 :(得分: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));

答案 2 :(得分:0)

首先使用iconv()转换字符串,然后在爆炸时使用它。转换为utf8

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

答案 3 :(得分:0)

除了简单的ASCII空间之外,还有许多字符可以在字符之间添加空格。

您可以尝试使用pres_split使用\ s(空格字符)或\ b(字边界)作为模式,但这可能不太理想,因为日语几乎肯定会以多字节格式编码。

答案 4 :(得分:0)

原因很简单,就是你这里没有空格字符。 你有一个“IDEOGRAPHIC SPACE”字符,其十六进制代码为“e3 80 80”。

如果您使用它作为分隔符,它将起作用。