我想存储在unicode字符的数组对中(char,char的实例数),但是我在传递unicode字符时遇到了一些问题:
此代码:
$str = 'ółś';
var_dump(str_split($str));
显示:
array(6) {
[0]=>
string(1) "�"
[1]=>
string(1) "�"
[2]=>
string(1) "�"
[3]=>
string(1) "�"
[4]=>
string(1) "�"
[5]=>
string(1) "�"
}
我不明白什么是错的
但是这段代码:
$arr = array('ó' => 1, 'ł' => 1, 'ś' => 1);
var_dump($arr);
显示:
array(3) {
["ó"]=>
int(1)
["ł"]=>
int(1)
["ś"]=>
int(1)
}
对我而言,这是一个结果,我想要实现。
修改
替换unicode字符的str_split(length = 1):
function mb_str_split( $string ) {
# Split at all position not after the start: ^
# and not before the end: $
return preg_split('/(?<!^)(?!$)/u', $string );
}
答案 0 :(得分:1)
PHP字符串函数,例如str_split()处理字节,而不是字符。
当使用UTF-8时,每个字符可能需要多个字节来表示 - 这意味着PHP字符串函数并不总是有效。
要操作UTF-8中的字符串,您应该使用mbstring扩展名,它提供了操作多字节字符串的函数。
在你的情况下,我不确定你应该使用哪个mbstring函数;也许mb_split()?
它似乎比str_split()
做得更多,但无论如何都可以提供帮助......
答案 1 :(得分:0)
代替(支持$ split_length参数):
function mb_str_split ($string, $split_length = -1)
{
if ($split_length == -1) {
$split_length = 1;
}
for ($i = 0, $len = mb_strlen ($string, 'UTF-8'); $i < $len; $i += $split_length) {
$array[] = mb_substr ($string, $i, $split_length, 'UTF-8');
}
return $array;
}