PHP экранировал специальные символы в html
У меня есть строка, которая выглядит как "v\u00e4lkommen till mig", которую я получаю после выполнения utf8_encode() над строкой.
Я хотел бы, чтобы эта строка стала
välkommen till mig
где персонаж
\u00e4 = ä = ä
Как я могу достичь этого в PHP?
3 ответа
Не используйте utf8_(de|en) код. Он просто конвертирует из UTF8 в ISO-8859-1 и обратно. ISO 8859-1 не предоставляет те же символы, что и ISO-8859-15 или Windows1252, которые являются наиболее часто используемыми кодировками (кроме UTF-8). Лучше использовать mb_convert_encoding.
"v \ u00e4lkommen till mig" > Эта строка выглядит как строка в кодировке JSON, которая уже кодирована в формате utf8. Позиция Unicode-кода "ä" - U + 00E4 >> \ u00e4.
пример
<?php
header('Content-Type: text/html; charset=utf-8');
$json = '"v\u00e4lkommen till mig"';
var_dump(json_decode($json)); //It will return a utf8 encoded string "välkommen till mig"
Каков источник этой строки?
Нет необходимости заменять ä на его HTML-представление & auml;, если вы распечатываете его в документе с кодировкой utf8 и сообщаете браузеру используемую кодировку. Если это необходимо, используйте htmlentities
:
<?php
$json = '"v\u00e4lkommen till mig"';
$string = json_decode($json);
echo htmlentities($string, ENT_COMPAT, 'UTF-8');
html_entity_decode
работал на меня.
$json = '"v\u00e4lkommen till mig"';
echo $decoded = html_entity_decode( json_decode($json) );
Изменить: так как вы хотите сохранить символы HTML, и я теперь думаю, что ваша исходная строка не совсем то, что вы опубликовали (я думаю, что это фактический Unicode, а не содержащий \unnnn
как строка), я думаю, что ваш лучший вариант это:
$html = str_replace( str_replace( str_replace( htmlentities( $whatever ), '<', '<' ), '>', '>' ), '&', '&' );
(примечание: нет звонка utf8-decode
)
Оригинальный ответ:
Там нет прямого обращения. Сначала расшифруйте его снова:
$decoded = utf8_decode( $whatever );
затем закодируйте как HTML:
$html = htmlentities( $decoded );
и, конечно, вы можете сделать это без переменной:
$html = htmlentities( utf8_decode( $whatever ) );
http://php.net/manual/en/function.utf8-decode.php
http://php.net/manual/en/function.htmlentities.php
Чтобы сделать это с помощью регулярного выражения (не рекомендуется, вероятно, медленнее, менее надежно), вы можете использовать тот факт, что HTML поддерживает &#xnnnn;
конструкции, где nnnn
такой же, как ваш существующий \unnnn
ценности. Итак, вы можете сказать:
$html = preg_replace( '/\\\\u([0-9a-f]{4})/i', '&#x$1;', $whatever )