我想用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