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. Это альтернатива молчаливому отбрасыванию недопустимых байтов или полной остановке процесса декодирования, в любом случае, если вы видите это, произошла ошибка.
нет возможности знайте, каким был первоначальный персонаж. Особенно с вашим решением, так как вы заменяете символ на _
, вы даже не можете знать, что исходный источник был декодирован неправильно. Вы должны вернуться к источнику и расшифровать его правильно.
Примечание: Можно использовать исходный текст �
как буквальный, нормальный символ, например, когда речь идет об этом, и тогда ошибки нет. Я исключаю эту возможность в своем ответе.