在传递unicode char时丢失unicode

时间:2011-03-27 09:31:14

标签: php

我想存储在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 );
} 

source

2 个答案:

答案 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;
}