У меня есть запрос MySQL, который возвращает данные для форматирования в файл XML. Один из столбцов - это свободное текстовое поле, которое может содержать странные символы, которые «разбивают» XML с ошибкой кодирования. Я считаю, что эти символы представляют собой странные кавычки, которые превратились в запись из вставленного Microsoft Word, когда пользователь изначально вводил запись. Я не контролирую этот процесс.

Пример странного персонажа:

“TURN KEY – Totally Furnished†

Я использую htmlspecialchars для «очистки» этих данных, и он в основном полностью удаляет поле из записи XML и делает его пустым для этой записи. Это устраняет проблему с кодировкой, но в этой записи теперь отсутствуют данные для этого поля. Мне все еще нужны эти данные, я просто хочу опустить или даже заменить странные символы чем-то вроде тире.

$description  = htmlspecialchars($row['PropertyInformation'], ENT_QUOTES, 'UTF-8');

Выходные данные XML заканчиваются следующим образом в записях, где встречаются странные символы:

<DESCRIPTIF>
<![CDATA[ ]]>
</DESCRIPTIF>
0
Rocco The Taco 3 Апр 2014 в 15:40

3 ответа

Лучший ответ

Функция htmlspecialchars возвращает пустую строку, если входная строка содержит недопустимую последовательность кодовых единиц в данной кодировке, если не установлены флаги ENT_IGNORE или ENT_SUBSTITUTE.

Флаг ENT_IGNORE автоматически отбрасывает недопустимые последовательности кодовых единиц вместо того, чтобы возвращать пустую строку. Использование этого флага не рекомендуется, поскольку это может иметь последствия для безопасности.

ENT_SUBSTITUTE falg заменяет недопустимые последовательности единиц кода на заменяющий символ Unicode U + FFFD (UTF-8) или & # FFFD; (в противном случае) вместо возврата пустой строки.

Вы можете попробовать установить один из этих флагов.

htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE);
1
cdog 6 Апр 2014 в 22:32

Похоже, вы забыли использовать utf-8 с большой буквы

$description = htmlspecialchars($row['PropertyInformation'], ENT_QUOTES, 'UTF-8');

1
Spoutnik16 3 Апр 2014 в 15:47
На выходе это никак не сказалось.
 – 
Rocco The Taco
3 Апр 2014 в 16:14
/**
 * Clean a string from non-printable chars
 * 
 * @param string $string
 * @return string
 */
function str_clean($string)
{
    return preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);
}


$string = '“TURN KEY – Totally Furnishedâ€';
echo htmlspecialchars(str_clean($string), ENT_QUOTES, 'UTF-8');
1
Mohammed Al Ashaal 7 Апр 2014 в 11:21