替换可以安全地用于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字节字符 如果你匹配,也就是说, a2x3xx
( a
在ASCII字节范围),因为a
< x
,和2x
不能是一个子集3xx
或4xxx
,等等,你可以放心,你的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()
可能是无辜的。