我想用strtr或str_replace替换一些无用的字符(错误与两者都相同)
这是一个使用deux无用字符的测试:
U + 201E:DOUBLE LOW-9报价标记(“)
U + 00AF:MACRON(¯)
<?php
$string = "This „ is a test";
$string = strtr($string, chr(ord("„")), " ");
$string = strtr($string, chr(ord("")), " ");
echo $string;
结果,我得到了This �� is a � test
的REPLACEMENT CHARACTER(Unicode U + FFFD)
它们是什么,以及如何删除它们?
答案 0 :(得分:1)
您的代码无效,因为您正在使用多字节字符串。
strtr
将一个字节视为一个字符,这对您的编码不安全。您需要使用多字节字符串函数http://php.net/manual/en/ref.mbstring.php或指定要替换的字节序列并在其上使用二进制安全字符串函数,例如str_replace
答案 1 :(得分:0)
您拨打strtr
的方式,它将翻译&#34;字符&#34;一个接一个,因为它没有编码意识到一个&#34;字符&#34;因为它是一个字节。这会破坏多字节字符串。
此外,chr(ord())
毫无意义,并进一步破坏了您的数据。 ord
只是将单个字节转换为单个整数,而chr
则反过来。这些函数对于您的目的是无用的,也不能处理多字节字符串。
简单地说:
str_replace(array('„', "\xC2\xAF"), ' ', $string)
str_replace
也不具备编码感知能力,但它并没有&#34;做&#34;任何具有给定字符串的东西,它只是寻找要替换的确切字节模式。这是一个使用UTF-8的安全操作。
我已经放置了文字&#34;“&#34;上面的字符,但使用字节表示法编码macron。由于macron是一个组合字符,因此在源代码中作为文字查看或处理可能会有问题。如果您的源代码文件保存为UTF-8且$string
也是UTF-8编码,那么这样就可以了。
如果这不能替换所需的字符,那么这些确切的字符就不在你的字符串中。使用bin2hex
检查字符串以查看它包含的确切字节。