PHP 中的'invalid code unit sequences'实际上是什么意思?'invalid code unit sequences'如何在 htmlspecialchars()



所以,我总是需要特定于PHP的答案,而不是通过考虑PHP以外的技术给出的通用答案。

我在运行Windows 10家庭单语言64位操作系统的笔记本电脑上使用PHP 7.3.3

我已经在我的笔记本电脑上安装了最新版本的XAMPP安装程序,该安装程序已安装Apache/2.4.38(Win64)PHP 7.3.3

今天,我遇到了PHP手册中的以下文本,描述了flags参数的可能值:

标志

以下一个或多个标志的位掩码,这些标志指定 如何处理引号、无效的代码单元序列和使用的 文档类型。默认值为ENT_COMPAT |ENT_HTML401

从上面的文本中,我不明白 PHP 中无效代码单元序列的实际含义。

我也没有任何地方得到无效代码单元序列的定义、解释或示例。

我恳请您为我提供一些无效代码单元序列的好例子。

另外,向我解释这种无效代码单元序列的现象如何与内置函数htmlspecialchars()一起工作?

答案伴随着合适的工作代码示例将非常珍贵。

谢谢。

字符串可能包含无效代码单元的原因可能很少。要理解为什么会这样,您首先需要了解代码单元是什么以及它与代码点有何不同。

Unicode 标准定义了一个代码点列表,简单来说,这意味着您需要的每个字符都应该有一个定义良好的 ID。因此,码位是 Unicode 标准中特定字符的唯一标识符。它在 17 个平面上定义了 1,114,112 个代码点。

Unicode 可以通过不同的字符编码来实现。Unicode 标准定义了 UTF-8、UTF-16 和 UTF-32,并且正在使用其他几种编码。最常用的编码是 UTF-8、UTF-16 和 UCS-2,UCS-2 是 UTF-16 的前身。每种编码将生成不同的代码单元来对特定代码点进行编码。

一个字节中可以存储的最大数量是 255,您可以看到代码点的数量远远超过了一个字节中可以存储的最大数量。这就是上面提到的多字节编码的用武之地。我建议在空闲时间阅读更多关于它们的信息,但为了简单起见,我从现在开始只讨论 UTF-8。

UTF-8 是一种可变长度编码。这意味着要编码字母A例如,您只需要 1 个字节,而不是例如使用 4 个字节𐍈。为了知道字符串序列中的哪个字节是多字节序列的一部分,您需要前缀代码。第一个字节表示序列中的字节数。所有字节构成该字符的代码单元。如果流在序列中间结束,则不会解码不正确的字符。代码单元的单个字节本身就是无效的代码单元;它不能被解码为指向正确的 Unicode 代码点。看看7F之后会发生什么。如果将其与PHP源代码进行比较,您可以清楚地看到,如果您遇到0x80

由于 UTF-16,某些代码点也可能是无效的代码单元。这些称为代理项,它们本身并不表示 Unicode 字符。

字符串可能由于许多不同的原因而格式不正确,但可能存在非法字节序列,即代码单元

无效代码单元序列的一些示例包括:

  • "xEDx9FxC0"- 代理人
  • "x80"
  • "xC2x79"
  • "xC3xC0"等等...

最新更新