如果仅将str_replace作为参数提供给有效的 UTF-8 编码字符串,是否可以安全地将其用于 UTF-8 编码字符串?

2022-08-30 18:33:13

PHP仅用于ANSI字符串,因此可以破坏UTF-8字符串。但是,鉴于它是二进制安全的,如果只给定有效的UTF-8字符串作为参数,它会正常工作吗?str_replace()

编辑:我不是在寻找替换函数,我只是想知道这个假设是否正确。


答案 1

是的。UTF-8 特意设计为允许此处理和其他类似的非 Unicode 感知处理。

在 UTF-8 中,任何表示有效字符的非 ASCII 字节序列始终以 区域 中的字节开头。此字节可能不会出现在序列中的其他任何位置,因此您无法创建与字符的一部分匹配的有效 UTF-8 序列。\xC0-\xFF

对于较旧的多字节编码,情况并非如此,其中字节序列的不同部分是无法区分的。这导致了很多问题,例如尝试替换Shift-JIS字符串中的ASCII反斜杠(其中字节可能是表示其他内容的字符序列的第二个字节)。\x5C


答案 2

这是正确的,因为 UTF-8 多字节字符完全是非 ASCII(128 个以上的字节值)字符,以定义后面字节数的字节开头,因此您不会意外地将一个 UTF-8 多字节字符的一部分与另一个 UTF-8 多字节字符的一部分匹配。

要可视化(抽象):

  • a对于 ASCII 字符
  • 2x对于 2 字节字符
  • 3xx对于 3 字节字符
  • 4xxx对于 4 字节字符

如果您正在匹配(ASCII 范围内的字节),由于 < ,并且不能是 或 的子集,等等,那么在前提是所有字符串都绝对有效 UTF-8 的情况下,您可以放心地确保 UTF-8 将正确匹配。a2x3xxaax2x3xx4xxx

编辑:请参阅bobince的答案,以获得不那么抽象的解释。


推荐