当我循环字符串时,为什么带有编码'UTF-8'的字符串有符号

时间:2015-12-22 22:44:33

标签: php encoding utf-8

我在utf-8中有变音字符串,显示确定:

var_dump($content);

它归还给我“höstlanseras”。 但是当我尝试这个时:

for ($i = 0; $i < strlen($content) - 1; $i++) {
    var_dump($content[$i]);
}

我有这个:

string(1) "h"
string(1) "o"
string(1) "�"
string(1) "�"
string(1) "s"
string(1) "t"
string(1) " "
string(1) "l"
string(1) "a"
string(1) "n"
string(1) "s"
string(1) "e"
string(1) "r"
string(1) "a"
string(1) "s"

如何将变音符号作为数组元素?

2 个答案:

答案 0 :(得分:1)

在UTF-8中,“ö”使用多个字节进行编码 PHP字符串是哑字节数组; PHP根本不知道“字符”等。
使用$str[x]访问字符串偏移可访问一个特定字节; strlen以字节为单位报告长度,而不是“字符”。

将所有这些放在一起,结果是您正在访问单个字节而不是字符,而在“ö”的情况下,这会导致输出一半字符/无意义字节。< / p>

使用mb_函数按字符正确迭代和访问字符串,而不是字节数:mb_strlenmb_substr

答案 1 :(得分:0)

strlen()是单字节:

  

strlen()返回字节数而不是字符串中的字符数。

UTF-8并非如此,您需要使用多字节替代方法:mb_strlen()

同样的规则适用于几乎所有字符串操作。