str_replace / strtr和替换字符

时间:2015-10-26 15:48:19

标签: php encoding utf-8

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

它们是什么,以及如何删除它们?

2 个答案:

答案 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检查字符串以查看它包含的确切字节。