替换可以安全地用于UTF

PHP的str_replace()仅适用于ANSI字符串,因此可能会破坏UTF-8字符串。 但是,如果它只有被赋予有效的UTF-8字符串作为参数,那么鉴于它是二进制安全的,它是否能够正常工作?

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


是。 UTF-8被有意设计为允许这种和其他类似的非Unicode感知处理。

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

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


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

想象(抽象地):

  • a ASCII字符
  • 2x为2字节字符
  • 3xx为3字节字符
  • 4xxx为4字节字符
  • 如果你匹配,也就是说, a2x3xxa在ASCII字节范围),因为a < x ,和2x不能是一个子集3xx4xxx ,等等,你可以放心,你的UTF-8将正确匹配,给所有字符串绝对有效的前提条件是UTF-8。

    编辑:请参阅bobince的答案,不太抽象的解释。


    好吧,我有一个反例:我有一个UTF8编码的设置“.ini”文件,指定了电子邮件发件人名称等应用程序设置,它的内容如下所示:

    email_from = Märta
    

    我从那里读到变量$sender 。 现在我替换消息体(再次使用UTF8)

    将{sender}

    $message = str_replace("{sender}",$sender_name,$message);
    

    这封电子邮件在各方面都绝对正确,但发件人已完全破解。 还有其他一些情况(如爆炸()),当UTF字符串出现问题时。 转换前是健康的,但不是在转换之后。 很抱歉,似乎没有办法纠正这种行为。

    编辑 :实际上, explode()涉及解析.ini文件,所以问题很可能在于该函数,所以str_replace()可能是无辜的。

    链接地址: http://www.djcxy.com/p/59331.html

    上一篇: replace be safely used on a UTF

    下一篇: String corrupted or preg