我正在尝试在页面上显示数据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中?
答案 0 :(得分:9)
您应该尝试修复原始问题,FFFD
(unicode replacement character)在大多数情况下并不是真正的文本字符,而是在UTF中尝试解码某些内容的信号编码,但实际上并没有用UTF编码编码。它是一种替代方法,可以无声地丢弃无效字节或完全停止解码过程,无论哪种方式,如果你看到它,都会出现错误。
无法知道原始角色是什么。特别是在您的解决方案中,由于您使用_
替换了字符,因此您甚至无法知道原始来源被错误地解码。您应该返回源并正确解码。
注意:源文本可以使用�
作为文字,普通字符,例如在谈论它时,并且没有错误。我在答案中排除了这种可能性。
答案 1 :(得分:7)
使用preg_replace代替:
$string = preg_replace('@\x{FFFD}@u', '_', $string);