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 ), '&lt;', '<' ), '&gt;', '>' ), '&amp;', '&' );

(примечание: нет звонка 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 )
Другие вопросы по тегам