str_replace是否可以安全地用于UTF-8编码的字符串,如果它只给出有效的UTF-8编码字符串作为参数?

Man*_*kis 22 php utf-8

PHP str_replace()仅适用于ANSI字符串,因此可以破坏UTF-8字符串.但是,如果只有有效的UTF-8字符串作为参数,那么它是二进制安全的吗?

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

bob*_*nce 19

是.UTF-8经过精心设计,允许进行此类和其他类似的非Unicode感知处理.

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

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


pin*_*hic 5

这是正确的,因为UTF-8多字节字符是非ASCII(128+字节值)字符,以一个字节开头,该字节定义了后面的字节数,因此您不会意外地最终匹配一个UTF-8多字节字符的一部分另一个.

要(抽象地)可视化:

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

如果你匹配,说,a2x3xx(a在ASCII字节范围),由于a< x,而2x不能是一个子集3xx4xxx,等等,你可以放心,你的UTF-8将正确匹配,给出的前提是所有的字符串是绝对有效的UTF-8.

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