如何在PHP数组中使用非ascii字符?

时间:2015-09-15 13:53:56

标签: php arrays utf-8 character-encoding

此代码填充一个数组,该数组用作按字母顺序排列的列表的排序指令。 $ stringX包含字母和其他字符,它们应该按字母顺序排列在同一标题下。

在这个例子中,指令是以Ǩ开头的列表项应该被视为从常规K开始。要使用其余代码,字符串将被解析为数组结构:

$stringX = "A B C D E F G H I J KǨ L M N O P Q R S T U V W X Y Z";
$result = explode(' ', $stringX);
$settingsArray = array();

foreach ($result as $value) {
   echo "Current set: " . $value . "<br>";
   $firstInGroup = $value[0];
   $allGroupMembers = $value;
   $memberArray = str_split($allGroupMembers);
   echo "Group header: " . $firstInGroup . "<br>";
   echo "All in group: " . $allGroupMembers . "<br>";
   echo "Member array: ";
   var_dump($memberArray);
   echo "<br>";
   $settingsArray[$firstInGroup] = $memberArray;
}

$sorterSettings = $settingsArray;

我的问题是,这显然只适用于ascii charakters。在此示例中,结果证明是:

Current value: KǨ
Group header: K
All in group: KǨ
Member array: array(3) { [0]=> string(1) "K" [1]=> string(1) "�" [2]=> string(1) "�" }

由于两个字符串$ allGroupMembers被写入三个数组字段,我怀疑这个字符有问题。

我知道UTF-8可能会给PHP带来困难,但我不确定最佳解决方案。关于如何在一个数组字段中编写KǨ的每个字符,保留特殊字符的建议将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

大多数PHP函数都使用字节,而不是字符(除了mb_ *函数和带有u修饰符的preg_)。对于ascii字符串,它是好的。 1个字节= 1个符号。对于utf-8字符串,这将不起作用。

所以str_split适用于字节。最好用更适合的东西替换它。例如,您可以执行此mb_str_split实施。或者,只需使用

$memberArray = preg_split("//u", $allGroupMembers, -1, PREG_SPLIT_NO_EMPTY);

P.S。 Explode也是“危险的”。对于此字符串,它按预期工作,因为其他字符中未使用空格字节。但它可能会因其他分隔符而失败。

答案 1 :(得分:0)

你的问题是str_split只处理单个字节,你的特殊k用2个字节编码(utf8是一个可变长度编码,aZ用单个字节编码,非常适合str_split,但你的特殊k是2使用一个理解utf8的函数来分割它...就像mb_split

一样
mb_regex_encoding('UTF-8');
$memberArray =mb_split('/./',$allGroupMembers);