如果仅将str_replace作为参数提供给有效的 UTF-8 编码字符串,是否可以安全地将其用于 UTF-8 编码字符串?
PHP仅用于ANSI字符串,因此可以破坏UTF-8字符串。但是,鉴于它是二进制安全的,如果只给定有效的UTF-8字符串作为参数,它会正常工作吗?str_replace()
编辑:我不是在寻找替换函数,我只是想知道这个假设是否正确。
PHP仅用于ANSI字符串,因此可以破坏UTF-8字符串。但是,鉴于它是二进制安全的,如果只给定有效的UTF-8字符串作为参数,它会正常工作吗?str_replace()
编辑:我不是在寻找替换函数,我只是想知道这个假设是否正确。
是的。UTF-8 特意设计为允许此处理和其他类似的非 Unicode 感知处理。
在 UTF-8 中,任何表示有效字符的非 ASCII 字节序列始终以 区域 中的字节开头。此字节可能不会出现在序列中的其他任何位置,因此您无法创建与字符的一部分匹配的有效 UTF-8 序列。\xC0-\xFF
对于较旧的多字节编码,情况并非如此,其中字节序列的不同部分是无法区分的。这导致了很多问题,例如尝试替换Shift-JIS字符串中的ASCII反斜杠(其中字节可能是表示其他内容的字符序列的第二个字节)。\x5C
这是正确的,因为 UTF-8 多字节字符完全是非 ASCII(128 个以上的字节值)字符,以定义后面字节数的字节开头,因此您不会意外地将一个 UTF-8 多字节字符的一部分与另一个 UTF-8 多字节字符的一部分匹配。
要可视化(抽象):
a
对于 ASCII 字符2x
对于 2 字节字符3xx
对于 3 字节字符4xxx
对于 4 字节字符如果您正在匹配(ASCII 范围内的字节),由于 < ,并且不能是 或 的子集,等等,那么在前提是所有字符串都绝对有效 UTF-8 的情况下,您可以放心地确保 UTF-8 将正确匹配。a2x3xx
a
a
x
2x
3xx
4xxx
编辑:请参阅bobince的答案,以获得不那么抽象的解释。