str_replace/strtr和替换字符


str_replace / strtr and Replacement Character

我想用strtr或str_replace替换一些无用的字符(两者的错误相同)

这里有一个测试与两个无用的字符:

U+201E:双低9引号(")

U+00AF:MACRON(')

<?php
$string = "This „ is a ­ test";
$string = strtr($string, chr(ord("„")), " ");
$string = strtr($string, chr(ord("­")), " ");
echo $string;

结果,我得到了带有替换字符(Unicode U+FFFD)的This �� is a � test

它们是什么?如何删除它们?

您调用strtr的方式是,它将逐个翻译"字符",并且由于它不进行编码,因此"字符"是一个字节。这将损坏多字节字符串。

此外,chr(ord())是毫无意义的,并且会进一步破坏您的数据。ord只是将单个字节转换为单个整数,而chr则相反。这些函数对您的目的毫无用处,也不能处理多字节字符串。

简单操作:

str_replace(array('„', "'xC2'xAF"), ' ', $string)

str_replace也不支持编码,但它不会对给定的字符串"执行"任何操作,它只是寻找要替换的确切字节模式。这是UTF-8的安全操作。

我在上面放置了文字"字符,但使用字节表示法对宏进行了编码。由于macron是一个组合字符,因此在源代码中以文字形式查看或处理可能会有问题。如果您的源代码文件保存为UTF-8,并且$string也是UTF-8编码的,那么这就可以了。

如果这不能替换所需的字符,那么这些确切的字符就不在字符串中。使用bin2hex检查字符串,查看它包含的确切字节数。

您的代码无法工作,因为您使用的是多字节字符串。

strtr将一个字节视为一个字符,这在您的编码中是不安全的。您需要使用多字节字符串函数http://php.net/manual/en/ref.mbstring.php或者指定要替换的字节序列,并在其上使用二进制安全字符串函数,例如str_replace