strlen() and UTF-8 encoding


strlen() and UTF-8 encoding

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

我只对 strlen() 感兴趣,而不是其他函数

这是字符串:

$1ï¿1/22

我在自己的电脑上测试过,验证了UTF-8编码,得到的答案是6。

我在

strlen 手册中没有看到任何内容,也没有看到我在 UTF-8 上读到的任何内容可以解释为什么上面的某些字符会少于 1。

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

使用 mb_strlen() 怎么样?

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

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

您发布的字符串长度为六个字符:$1ï¿1/22(美元符号、数字 1、带变音的小写 i、颠倒问号、半分数、数字 2)

如果 strlen() 是使用该字符串的 UTF-8 表示形式调用的,你会得到 9 的结果(可能,尽管有多个不同长度的表示)。

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

当 UTF-8

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

原始字符串似乎是通过多层误解处理的;通过在非 UTF-8 数据上使用 UTF-8 解码器(产生 1 美元 2),然后通过您用来分析该数据的任何内容(产生 1ï¿1/22)。

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

mb_strlen($string, 'UTF-8');
很可能

在准备问题和阅读问题之间的某个时候,某些过程在其中破坏了非 ASCII 字符,因此问题最初是关于某个包含 4 个字符的字符串。

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

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

该文件由使用 UTF-8 的程序读取。由于无法解释与¢对应的字节,程序将其替换并读取文本$1�2。然后使用 UTF-8 写出此文本,导致文件中$1'xEF'xBF'xBD2

然后出现了第三个程序,它以 latin1 读取文件,并显示$1�2 .

No.

我将使用矛盾证明。

strlen

计算字节数,因此 strlen 为 4 时,该字符串中需要正好有 4 个字节

UTF8 编码每个字符至少需要 1 个字节

我们已经确定:

  1. 有 4 个字节
  2. 字符由不少于1个字节表示

。然而,我们有 6 个字符....这是一个矛盾。所以,没有。

但是,不完全清楚的是显示软件(例如,Web浏览器)使用哪个字符集来理解字符串。它可以使用一些不常见的编码方案,其中字符可以用小于 8 位表示。如果是这种情况,则 4 个字节可以显示为 6 个字符。因此,字符串可以是utf8,但浏览器可以决定将其解释为一些5位字符集。

许多 UTF-8 字符需要几个字节而不是一个字节。这就是 UTF-8 的构造方式(这就是您在单个集合中拥有如此多字符的方式)。

请尝试mb_strlen()