PHP:如何编码U + FFFD以进行替换?

时间:2012-12-05 15:56:45

标签: php character-encoding escaping special-characters

我正在尝试在页面上显示数据Feed。我们遇到了一个奇怪角色的编码问题。出于某种原因,在Feed中有U+FFFD个字符。并且htmlentities()不会逃避角色,所以我需要手动替换它。 (我使用的是PHP 5.3)

我尝试了以下内容:

$string = str_replace( "\xFFFD",  "_", $string );
$string = str_replace( "\XFFFD",  "_", $string );
$string = str_replace( "\uFFFD",  "_", $string );
$string = str_replace("\x{FFFD}", "_", $string );
$string = str_replace("\X{FFFD}", "_", $string );
$string = str_replace("\P{FFFD}", "_", $string );
$string = str_replace("\p{FFFD}", "_", $string );

以上都不是。

阅读本页后 - http://php.net/manual/en/regexp.reference.unicode.php - 我不确定我做错了什么。我是否需要将UTF-8支持编译到PCRE中?

2 个答案:

答案 0 :(得分:9)

您应该尝试修复原始问题,FFFDunicode replacement character)在大多数情况下并不是真正的文本字符,而是在UTF中尝试解码某些内容的信号编码,但实际上并没有用UTF编码编码。它是一种替代方法,可以无声地丢弃无效字节或完全停止解码过程,无论哪种方式,如果你看到它,都会出现错误。

无法知道原始角色是什么。特别是在您的解决方案中,由于您使用_替换了字符,因此您甚至无法知道原始来源被错误地解码。您应该返回源并正确解码。

注意:源文本可以使用作为文字,普通字符,例如在谈论它时,并且没有错误。我在答案中排除了这种可能性。

答案 1 :(得分:7)

使用preg_replace代替:

$string = preg_replace('@\x{FFFD}@u', '_', $string);