PHP: как кодировать U+FFFD, чтобы сделать замену?

Я пытаюсь отобразить поток данных на странице. У нас проблемы с кодировкой со странным персонажем. По какой-то причине в корме есть 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 ответов


использовать человек вместо этого вот так:

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

вы должны попытаться исправить исходную проблему,FFFD (The символ замены Юникода) в большинстве случаев не означает, что это реальный текстовый символ, а знак того, что что-то пытались декодировать в кодировке UTF, но что-то на самом деле не было закодировано в кодировке UTF. Это альтернатива молчаливому отбрасыванию недопустимых байтов или полной остановке процесса декодирования, в любом случае, если вы видите это, произошла ошибка.

нет возможности знайте, каким был первоначальный персонаж. Особенно с вашим решением, так как вы заменяете символ на _, вы даже не можете знать, что исходный источник был декодирован неправильно. Вы должны вернуться к источнику и расшифровать его правильно.

Примечание: Можно использовать исходный текст как буквальный, нормальный символ, например, когда речь идет об этом, и тогда ошибки нет. Я исключаю эту возможность в своем ответе.