strlen()和UTF-8编码

Jon*_*les 10 php unicode utf-8 strlen

假设在PHP中使用UTF-8编码和strlen(),这个字符串的长度是4吗?

我只想知道strlen(),而不是其他函数

这是字符串:$1�2

我在自己的计算机上测试过,我已经验证了UTF-8编码,我得到的答案是6.

我在strlen手册或者我在UTF-8上读过的任何内容中都没有看到任何可以解释为什么上面的一些字符会少于一个的原因.

PS:这个问题和答案(4)来自我在Ebay上购买的ZCE的模拟测试.

PPS:请给我一个骨头并投票.我做了我的功课.提前感谢所有回复和投票.

Ant*_*ton 19

如何使用mb_strlen()?

http://lt.php.net/manual/en/function.mb-strlen.php

但是如果你需要使用strlen,可以通过将mbstring.func_overload指令设置为2来配置你的web服务器,这样它就会在你的脚本中自动替换使用strlen到mb_strlen.


Hai*_*vgi 9

需要使用多字节字符串函数mb_strlen(),如:

mb_strlen($string, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)


bam*_*s53 9

您发布的字符串长度为六个字符:$1�2(美元符号,数字1,带有分音符的小写字母i,颠倒的问号,一半分数,数字二)

如果使用该字符串的UTF-8表示调用strlen(),则会得到9的结果(可能,虽然有多个具有不同长度的表示).

但是,如果我们将该字符串存储为ISO 8859-1或CP1252,我们将有一个六字节长的序列,合法的为UTF-8.将这6个字节重新解释为UTF-8将产生4个字符:$1 2(美元符号,数字1,Unicode替换字符,数字2).也就是说,单个字符' '的UTF-8编码与三个字符"�"的ISO-8859-1编码相同.

当UTF-8解码器读取的数据不是有效的UTF-8数据时,通常会插入替换字符.

似乎原始字符串是通过多层误解来处理的; 通过在非UTF-8数据上使用UTF-8解码器(产生$1 2),然后通过用于分析该数据的任何数据(产生$ 1 ^ 2).


Jon*_*oni 5

很可能在问题的准备和你的阅读之间的某个时刻,某些进程已经破坏了非ASCII字符,因此问题最初是关于一些字符串,其中包含4个字符.

�当您以UTF-8 编码替换字符U + FFFD( )并将结果解释为latin1 时,将获得序列.例如,此字符用于替换在从文件读取文本时不对任何字符进行编码的字节序列.发生了什么事可能是这样的:

存储在latin1文本文件中的原始问题具有:( $1¢2您可以将¢替换为任何非ASCII字符)

该文件由使用UTF-8的程序读取.由于无法解释对应于¢的字节,程序将替换它并读取文本$1?2.然后使用UTF-8写出该文本,从而生成$1\xEF\xBF\xBD2文件.

然后是第三个程序来读取latin1中的文件,然后显示$1�2.