html_entity_decode — Преобразует HTML сущности в соответствующие символы


Содержание

Преобразование сущностей HTML в соответствующие им символы

Решение

Это было двойное кодирование, поэтому вам нужно декодировать дважды & необходимо декодировать в & чтобы получить так далее…

Если вы делаете кодирование, посмотрите на $double_encode параметр для htmlspecialchars() а также htmlentities() ,

Если кодируется несколько раз, вы можете использовать:

Другие решения

Попробуйте использовать «htmlspecialchars_decode ()» вместо «html_entity_decode ()»

html_entity_decode()

Синтаксис:

html_entity_decode (string [, quote_style[, charset]] )

Поддерживается следующими версиями PHP:

Описание функции:

Функция html_entity_decode преобразует символы (HTML сущности) в HTML теги . Функция обратная htmlentities()

Обязательный аргумент. Строка с данными для преобразования

Необязательный аргумент. Флаг определяет как будут обрабатываться двойные и одинарные кавычки.

ENT_COMPAT — конвертируются двойные кавычки, а одинарные остаются без изменений (используется по умолчанию);

ENT_QUOTES — конвертируются двойные и одинарные кавычки;

ENT_NOQUOTES — любые кавычки не конвертируются;

Необязательный аргумент. Определяет кодировку, используемую при преобразовании. Поддерживаются следующие кодировки:

ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, KOI8-R, BIG5, GB2312, BIG5-HKSCS, Shift_JIS, EUC-JP

Если ни одна из выше перечисленных кодировок не поддерживаются, то по умолчанию применяется ISO-8859-1 (с версии 5.4, до этого использовалась кодировка UTF-8

string

Примеры:

Пример 1:

print html_entity_decode(«это жирный текст»);
?>


Html_entity_decode — Преобразует HTML сущности в соответствующие символы

(PHP 4 >= 4.3.0, PHP 5)

html_entity_decode — Преобразует HTML сущности в соответствующие символы

Описание string html_entity_decode ( string string [, int quote_style [, string charset]] )

Необязательный аргумент quote_style позволяет указать способ обработки ‘одиночных’ и «двойных» кавычек. Значением этого аргумента может быть одна из трех следующих констант (по умолчанию ENT_COMPAT ):

Таблица 1. Константы quote_style

Имя константы Описание
ENT_COMPAT Преобразуются двойные кавычки, одиночные остаются без изменений.
ENT_QUOTES Преобразуются и двойные, и одиночные кавычки.
ENT_NOQUOTES И двойные, и одиночные кавычки остаются без изменений.

Необязательный третий аргумент charset определяет кодировку, используемую при преобразовании. По умолчанию используется кодировка ISO-8859-1.

Начиная с PHP 4.3.0 поддерживаются следующие кодировки.

Таблица 2. Поддерживаемые кодировки

Кодировка Псевдонимы Описание
ISO-8859-1 ISO8859-1 Западно-европейская Latin-1
ISO-8859-15 ISO8859-15 Западно-европейская Latin-9. Добавляет знак евро, французские и финские буквы к кодировке Latin-1(ISO-8859-1).
UTF-8 8-битная Unicode, совместимая с ASCII.
cp866 ibm866, 866 Кириллическая кодировка, применяемая в DOS. Поддерживается в версии 4.3.2.
cp1251 Windows-1251, win-1251, 1251 Кириллическая кодировка, применяемая в Windows. Поддерживается в версии 4.3.2.
cp1252 Windows-1252, 1252 Западно-европейская кодировка, применяемая в Windows.
KOI8-R koi8-ru, koi8r Русская кодировка. Поддерживается в версии 4.3.2.
BIG5 950 Традиционный китайский, применяется в основном на Тайване.
GB2312 936 Упрощенный китайский, стандартная национальная кодировка.
BIG5-HKSCS Расширенная Big5, применяемая в Гонг-Конге.
Shift_JIS SJIS, 932 Японская кодировка.
EUC-JP EUCJP Японская кодировка.

Замечание: Не перечисленные выше кодировки не поддерживаются, и вместо них применяется ISO-8859-1.

Пример 1. Декодирование HTML сущностей

$a = htmlentities ( $orig );

$b = html_entity_decode ( $a );

echo $a ; // I’ll «walk» the dog now

echo $b ; // I’ll «walk» the dog now

// в версиях до PHP 4.3.0 можно сделать так:
function unhtmlentities ( $string )
<
$trans_tbl = get_html_translation_table ( HTML_ENTITIES );
$trans_tbl = array_flip ( $trans_tbl );
return strtr ( $string , $trans_tbl );
>

$c = unhtmlentities ( $a );

echo $c ; // I’ll «walk» the dog now

Замечание: Может показаться странным, что результатом вызова trim(html_entity_decode(‘ ‘)); не является пустая строка Причина том, что ‘ ‘ преобразуется не в символ с ASCII-кодом 32 (который удаляется функцией trim() ),а в символ с ASCII-кодом 160 (0xa0) в принимаемой по умолчанию кодировке ISO-8859-1.

Пред. Начало След.
hebrevc Уровень выше htmlentities

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Html_entity_decode — Преобразует HTML сущности в соответствующие символы


(PHP 4 >= 4.3.0, PHP 5)

html_entity_decode — Преобразует HTML сущности в соответствующие символы

Описание string html_entity_decode ( string string [, int quote_style [, string charset]] )

Необязательный аргумент quote_style позволяет указать способ обработки ‘одиночных’ и «двойных» кавычек. Значением этого аргумента может быть одна из трех следующих констант (по умолчанию ENT_COMPAT ):

Таблица 1. Константы quote_style

Имя константы Описание
ENT_COMPAT Преобразуются двойные кавычки, одиночные остаются без изменений.
ENT_QUOTES Преобразуются и двойные, и одиночные кавычки.
ENT_NOQUOTES И двойные, и одиночные кавычки остаются без изменений.

Необязательный третий аргумент charset определяет кодировку, используемую при преобразовании. По умолчанию используется кодировка ISO-8859-1.

Начиная с PHP 4.3.0 поддерживаются следующие кодировки.

Таблица 2. Поддерживаемые кодировки

Кодировка Псевдонимы Описание
ISO-8859-1 ISO8859-1 Западно-европейская Latin-1
ISO-8859-15 ISO8859-15 Западно-европейская Latin-9. Добавляет знак евро, французские и финские буквы к кодировке Latin-1(ISO-8859-1).
UTF-8 8-битная Unicode, совместимая с ASCII.
cp866 ibm866, 866 Кириллическая кодировка, применяемая в DOS. Поддерживается в версии 4.3.2.
cp1251 Windows-1251, win-1251, 1251 Кириллическая кодировка, применяемая в Windows. Поддерживается в версии 4.3.2.
cp1252 Windows-1252, 1252 Западно-европейская кодировка, применяемая в Windows.
KOI8-R koi8-ru, koi8r Русская кодировка. Поддерживается в версии 4.3.2.
BIG5 950 Традиционный китайский, применяется в основном на Тайване.
GB2312 936 Упрощенный китайский, стандартная национальная кодировка.
BIG5-HKSCS Расширенная Big5, применяемая в Гонг-Конге.
Shift_JIS SJIS, 932 Японская кодировка.
EUC-JP EUCJP Японская кодировка.

Замечание: Не перечисленные выше кодировки не поддерживаются, и вместо них применяется ISO-8859-1.

Пример 1. Декодирование HTML сущностей

= «I’ll \»walk\» the dog now» ;

$a = htmlentities ( $orig );

$b = html_entity_decode ( $a );

echo $a ; // I’ll «walk» the dog now

echo $b ; // I’ll «walk» the dog now

// в версиях до PHP 4.3.0 можно сделать так:
function unhtmlentities ( $string )
<
$trans_tbl = get_html_translation_table ( HTML_ENTITIES );
$trans_tbl = array_flip ( $trans_tbl );
return strtr ( $string , $trans_tbl );
>

$c = unhtmlentities ( $a );

echo $c ; // I’ll «walk» the dog now

Замечание: Может показаться странным, что результатом вызова trim(html_entity_decode(‘ ‘)); не является пустая строка Причина том, что ‘ ‘ преобразуется не в символ с ASCII-кодом 32 (который удаляется функцией trim() ),а в символ с ASCII-кодом 160 (0xa0) в принимаемой по умолчанию кодировке ISO-8859-1.

To convert html entities into unicode characters, use the following:

$trans_tbl = get_html_translation_table(HTML_ENTITIES);
foreach($trans_tbl as $k => $v)
<
$ttr[$v] = utf8_encode($k);
>

$text = strtr($text, $ttr);


Quick & dirty code that translates numeric entities to UTF-8.

function replace_num_entity ( $ord )
<
$ord = $ord [ 1 ];
if ( preg_match ( ‘/^x([0-9a-f]+)$/i’ , $ord , $match ))
<
$ord = hexdec ( $match [ 1 ]);
>
else
<
$ord = intval ( $ord );
>

$no_bytes = 0 ;
$byte = array();

if ( $ord 128 )
<
return chr ( $ord );
>
elseif ( $ord 2048 )
<
$no_bytes = 2 ;
>
elseif ( $ord 65536 )
<
$no_bytes = 3 ;
>
elseif ( $ord 1114112 )
<
$no_bytes = 4 ;
>
else
<
return;
>

switch( $no_bytes )
<
case 2 :
<
$prefix = array( 31 , 192 );
break;
>
case 3 :
<
$prefix = array( 15 , 224 );
break;
>
case 4 :
<
$prefix = array( 7 , 240 );
>
>

$ret = » ;
for ( $i = 0 ; $i $no_bytes ; $i ++)
<
$ret .= chr ( $byte [ $i ]);
>

$test = ‘This is a čא test» ;

echo $test . «
\n» ;
echo preg_replace_callback ( ‘/&#([0-9a-fx]+);/mi’ , ‘replace_num_entity’ , $test );

Passing NULL or FALSE as a string will generate a ‘500 Internal Server Error’ (or break the script when inside a function).

So always test your string first before passing it to html_entity_decode().

This function seems to have to have two limitations (at least in PHP 4.3.8):

a) it does not work with multibyte character codings, such as UTF-8
b) it does not decode numeric entity references

a) can be solved by using iconv to convert to ISO-8859-1, then decoding the entities, than convert to UTF-8 again. But that’s quite ugly and detroys all characters not present in Latin-1.

b) can be solved rather nicely using the following code:

function decode_entities ( $text ) <
$text = html_entity_decode ( $text , ENT_QUOTES , «ISO-8859-1» ); #NOTE: UTF-8 does not work!
$text = preg_replace ( ‘/&#(\d+);/me’ , «chr(\\1)» , $text ); #decimal notation
$text = preg_replace ( ‘/&#x([a-f0-9]+);/mei’ , «chr(0x\\1)» , $text ); #hex notation
return $text ;
>
?>

HTH

This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

Почему не преобразовываются html сущности через html_entity_decode?

Ребят, привет!
Прошу помощи! Очень сильно! Убил весь день, не могу понять что за фигня такая.

Суть проблемы!
Я сохраняю в базу данных скрытые поля автореспондера, дабы потом их использовать. При отправке формы, эти скрытые поля автореспондера проганяются через htmlentities дабы обезвредить код, затем происходит запись в БД. — Здесь все хорошо! Запись проходит, преобразование тоже.

НО! При обратном декодировании HTML сущности не преобразовываются, я использую функцию — html_entity_decode.

У меня есть возможность предпросмотра файла, в который эти данные будут записаны — проблема в том, что эти скрытые поля отображаются получается как обычный текст — вот что я получаю в исходном коде

А при записи этих данных в файл, естественно перед записью я прогоняю это все хозяйство через html_entity_decode — у меня получается в файле вот такое чудо

Ребят, как бороться с этим. Я вообще не могу понять что не так. :( Прошу помощи очень сильно.


Либо подскажите как HTML код сохранять лучше всего в базе данных, чтобы потом можно было его использовать.

Http Utility. Html Decode Метод

Определение

Преобразует строку, преобразованную в кодировку HTML для передачи по протоколу HTTP, в декодированную строку. Converts a string that has been HTML-encoded for HTTP transmission into a decoded string.

Чтобы закодировать или декодировать значения вне веб-приложения, используйте класс WebUtility. To encode or decode values outside of a web application, use the WebUtility class.

Перегрузки

Преобразует строку, преобразованную в кодировку HTML для передачи по протоколу HTTP, в декодированную строку. Converts a string that has been HTML-encoded for HTTP transmission into a decoded string.

Преобразует строку в формате HTML в декодированную строку и отправляет декодированную строку в выходной поток TextWriter. Converts a string that has been HTML-encoded into a decoded string, and sends the decoded string to a TextWriter output stream.

HtmlDecode(String)

Преобразует строку, преобразованную в кодировку HTML для передачи по протоколу HTTP, в декодированную строку. Converts a string that has been HTML-encoded for HTTP transmission into a decoded string.

Параметры

Строка для расшифровки. The string to decode.

Возвраты

Расшифрованная строка. A decoded string.

Примеры

В следующем примере кода демонстрируются HtmlEncode методы HtmlDecode HttpUtility и класса. The following code example demonstrates the HtmlEncode and HtmlDecode methods of the HttpUtility class. Входная строка кодируется с помощью HtmlEncode метода. The input string is encoded using the HtmlEncode method. Полученная кодированная строка затем декодируется с помощью HtmlDecode метода. The encoded string obtained is then decoded using the HtmlDecode method.

Комментарии

Если такие символы, как пробелы и знаки препинания, передаются в HTTP-потоке, они могут быть неверно интерпретированы в принимающей стороне. If characters such as blanks and punctuation are passed in an HTTP stream, they might be misinterpreted at the receiving end. Кодировка HTML преобразует символы, недопустимые в HTML, в эквиваленты символьных сущностей; Декодирование HTML изменяет кодировку. HTML encoding converts characters that are not allowed in HTML into character-entity equivalents; HTML decoding reverses the encoding. Например, при внедрении в блок текста символы кодируются как и > для передачи по протоколу HTTP. For example, when embedded in a block of text, the characters are encoded as and > for HTTP transmission.

Чтобы закодировать или декодировать значения вне веб-приложения, используйте класс WebUtility. To encode or decode values outside of a web application, use the WebUtility class.

Дополнительно

HtmlDecode(String, TextWriter)

Преобразует строку в формате HTML в декодированную строку и отправляет декодированную строку в выходной поток TextWriter. Converts a string that has been HTML-encoded into a decoded string, and sends the decoded string to a TextWriter output stream.

Параметры

Строка для расшифровки. The string to decode.


Поток выходных данных TextWriter. A TextWriter stream of output.

Комментарии

Если такие символы, как пробелы и знаки препинания, передаются в HTTP-потоке, они могут быть неверно интерпретированы в принимающей стороне. If characters such as blanks and punctuation are passed in an HTTP stream, they might be misinterpreted at the receiving end. Кодировка HTML преобразует символы, недопустимые в HTML, в эквиваленты символьных сущностей; Декодирование HTML изменяет кодировку. HTML encoding converts characters that are not allowed in HTML into character-entity equivalents; HTML decoding reverses the encoding. Например, при внедрении в блок текста символы кодируются как и > для передачи по протоколу HTTP. For example, when embedded in a block of text, the characters are encoded as and > for HTTP transmission.

Чтобы закодировать или декодировать значения вне веб-приложения, используйте класс WebUtility. To encode or decode values outside of a web application, use the WebUtility class.

html_entity_decode

(PHP 4 >= 4.3.0, PHP 5)

html_entity_decode — Преобразует HTML сущности в соответствующие символы

Описание

html_entity_decode(), в противоположность функции htmlentities(), Преобразует HTML сущности в строке string в соответствующие символы.

Необязательный аргумент quote_style позволяет указать способ обработки ‘одиночных’ и «двойных» кавычек. Значением этого аргумента может быть одна из трех следующих констант (по умолчанию ENT_COMPAT):

Константы quote_style
Имя константы Описание
ENT_COMPAT Преобразуются двойные кавычки, одиночные остаются без изменений.
ENT_QUOTES Преобразуются и двойные, и одиночные кавычки.
ENT_NOQUOTES И двойные, и одиночные кавычки остаются без изменений.

Необязательный третий аргумент charset определяет кодировку, используемую при преобразовании. По умолчанию используется кодировка ISO-8859-1.

Начиная с PHP 4.3.0 поддерживаются следующие кодировки.

Поддерживаемые кодировки
Кодировка Псевдонимы Описание
ISO-8859-1 ISO8859-1 Западно-европейская Latin-1
ISO-8859-15 ISO8859-15 Западно-европейская Latin-9. Добавляет знак евро, французские и финские буквы к кодировке Latin-1(ISO-8859-1).
UTF-8 8-битная Unicode, совместимая с ASCII.
cp866 ibm866, 866 Кириллическая кодировка, применяемая в DOS. Поддерживается в версии 4.3.2.
cp1251 Windows-1251, win-1251, 1251 Кириллическая кодировка, применяемая в Windows. Поддерживается в версии 4.3.2.
cp1252 Windows-1252, 1252 Западно-европейская кодировка, применяемая в Windows.
KOI8-R koi8-ru, koi8r Русская кодировка. Поддерживается в версии 4.3.2.
BIG5 950 Традиционный китайский, применяется в основном на Тайване.
GB2312 936 Упрощенный китайский, стандартная национальная кодировка.
BIG5-HKSCS Расширенная Big5, применяемая в Гонг-Конге.
Shift_JIS SJIS, 932 Японская кодировка.
EUC-JP EUCJP Японская кодировка.

Замечание: Не перечисленные выше кодировки не поддерживаются, и вместо них применяется ISO-8859-1.

Пример #1 Декодирование HTML сущностей

= «I’ll \»walk\» the dog now» ;

$a = htmlentities ( $orig );

$b = html_entity_decode ( $a );

echo $a ; // I’ll «walk» the dog now

echo $b ; // I’ll «walk» the dog now

// в версиях до PHP 4.3.0 можно сделать так:
function unhtmlentities ( $string )
<
$trans_tbl = get_html_translation_table ( HTML_ENTITIES );
$trans_tbl = array_flip ( $trans_tbl );
return strtr ( $string , $trans_tbl );
>

$c = unhtmlentities ( $a );

echo $c ; // I’ll «walk» the dog now

Замечание: Может показаться странным, что результатом вызова trim(html_entity_decode(‘ ‘)); не является пустая строка Причина том, что ‘ ‘ преобразуется не в символ с ASCII-кодом 32 (который удаляется функцией trim()),а в символ с ASCII-кодом 160 (0xa0) в принимаемой по умолчанию кодировке ISO-8859-1.

Коментарии


This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

This function seems to have to have two limitations (at least in PHP 4.3.8):

a) it does not work with multibyte character codings, such as UTF-8
b) it does not decode numeric entity references

a) can be solved by using iconv to convert to ISO-8859-1, then decoding the entities, than convert to UTF-8 again. But that’s quite ugly and detroys all characters not present in Latin-1.

b) can be solved rather nicely using the following code:

function decode_entities ( $text ) <
$text = html_entity_decode ( $text , ENT_QUOTES , «ISO-8859-1» ); #NOTE: UTF-8 does not work!
$text = preg_replace ( ‘/&#(\d+);/me’ , «chr(\\1)» , $text ); #decimal notation
$text = preg_replace ( ‘/&#x([a-f0-9]+);/mei’ , «chr(0x\\1)» , $text ); #hex notation
return $text ;
>
?>

HTH

Quick & dirty code that translates numeric entities to UTF-8.

function replace_num_entity ( $ord )
<
$ord = $ord [ 1 ];
if ( preg_match ( ‘/^x([0-9a-f]+)$/i’ , $ord , $match ))
<
$ord = hexdec ( $match [ 1 ]);
>
else
<
$ord = intval ( $ord );
>

$no_bytes = 0 ;
$byte = array();

if ( $ord 128 )
<
return chr ( $ord );
>
elseif ( $ord 2048 )
<
$no_bytes = 2 ;
>
elseif ( $ord 65536 )
<
$no_bytes = 3 ;
>
elseif ( $ord 1114112 )
<
$no_bytes = 4 ;
>
else
<
return;
>

switch( $no_bytes )
<
case 2 :
<
$prefix = array( 31 , 192 );
break;
>
case 3 :
<
$prefix = array( 15 , 224 );
break;
>
case 4 :
<
$prefix = array( 7 , 240 );
>
>

$ret = » ;
for ( $i = 0 ; $i $no_bytes ; $i ++)
<
$ret .= chr ( $byte [ $i ]);
>

$test = ‘This is a čא test» ;

echo $test . «
\n» ;
echo preg_replace_callback ( ‘/&#([0-9a-fx]+);/mi’ , ‘replace_num_entity’ , $test );

echo urlencode ( html_entity_decode ( » » ));

?>

will output «%A0» instead of «+».

Here is the ultimate functions to convert HTML entities to UTF-8 :
The main function is htmlentities2utf8
Others are helper functions

function chr_utf8 ( $code )
<
if ( $code 0 ) return false ;
elseif ( $code 128 ) return chr ( $code );
elseif ( $code 160 ) // Remove Windows Illegals Cars
<
if ( $code == 128 ) $code = 8364 ;
elseif ( $code == 129 ) $code = 160 ; // not affected
elseif ( $code == 130 ) $code = 8218 ;
elseif ( $code == 131 ) $code = 402 ;
elseif ( $code == 132 ) $code = 8222 ;
elseif ( $code == 133 ) $code = 8230 ;
elseif ( $code == 134 ) $code = 8224 ;
elseif ( $code == 135 ) $code = 8225 ;
elseif ( $code == 136 ) $code = 710 ;
elseif ( $code == 137 ) $code = 8240 ;
elseif ( $code == 138 ) $code = 352 ;
elseif ( $code == 139 ) $code = 8249 ;
elseif ( $code == 140 ) $code = 338 ;
elseif ( $code == 141 ) $code = 160 ; // not affected
elseif ( $code == 142 ) $code = 381 ;
elseif ( $code == 143 ) $code = 160 ; // not affected
elseif ( $code == 144 ) $code = 160 ; // not affected
elseif ( $code == 145 ) $code = 8216 ;
elseif ( $code == 146 ) $code = 8217 ;
elseif ( $code == 147 ) $code = 8220 ;
elseif ( $code == 148 ) $code = 8221 ;
elseif ( $code == 149 ) $code = 8226 ;
elseif ( $code == 150 ) $code = 8211 ;
elseif ( $code == 151 ) $code = 8212 ;
elseif ( $code == 152 ) $code = 732 ;
elseif ( $code == 153 ) $code = 8482 ;
elseif ( $code == 154 ) $code = 353 ;
elseif ( $code == 155 ) $code = 8250 ;
elseif ( $code == 156 ) $code = 339 ;
elseif ( $code == 157 ) $code = 160 ; // not affected
elseif ( $code == 158 ) $code = 382 ;
elseif ( $code == 159 ) $code = 376 ;
>
if ( $code 2048 ) return chr ( 192 | ( $code >> 6 )) . chr ( 128 | ( $code & 63 ));
elseif ( $code 65536 ) return chr ( 224 | ( $code >> 12 )) . chr ( 128 | (( $code >> 6 ) & 63 )) . chr ( 128 | ( $code & 63 ));
else return chr ( 240 | ( $code >> 18 )) . chr ( 128 | (( $code >> 12 ) & 63 )) . chr ( 128 | (( $code >> 6 ) & 63 )) . chr ( 128 | ( $code & 63 ));
>

// Callback for preg_replace_callback(‘

‘, ‘html_entity_replace’, $str);
function html_entity_replace ( $matches )
<
if ( $matches [ 2 ])
<
return chr_utf8 ( hexdec ( $matches [ 3 ]));
> elseif ( $matches [ 1 ])
<
return chr_utf8 ( $matches [ 3 ]);
>
switch ( $matches [ 3 ])
<
case «nbsp» : return chr_utf8 ( 160 );
case «iexcl» : return chr_utf8 ( 161 );
case «cent» : return chr_utf8 ( 162 );
case «pound» : return chr_utf8 ( 163 );
case «curren» : return chr_utf8 ( 164 );
case «yen» : return chr_utf8 ( 165 );
//. etc with all named HTML entities
>
return false ;
>

function htmlentities2utf8 ( $string ) // because of the html_entity_decode() bug with UTF-8
<
$string = preg_replace_callback ( ‘

‘ , ‘html_entity_replace’ , $string );
return $string ;
>
?>

The decipherment does the character encoded by the escape function of JavaScript.
When the multi byte is used on the page, it is effective.


javascript escape(‘aaああaa’) . ‘aa%u3042%u3042aa’
php jsEscape_decode(‘aa%u3042%u3042aa’)..’aaああaa’

function jsEscape_decode ( $jsEscaped , $outCharCode = ‘SJIS’ ) <
$arrMojis = explode ( «%u» , $jsEscaped );
for ( $i = 1 ; $i count ( $arrMojis ); $i ++) <
$c = substr ( $arrMojis [ $i ], 0 , 4 );
$cc = mb_convert_encoding ( pack ( ‘H*’ , $c ), $outCharCode , ‘UTF-16’ );
$arrMojis [ $i ] = substr_replace ( $arrMojis [ $i ], $cc , 0 , 4 );
>
return implode ( » , $arrMojis );
>
?>

I had a problem getting the ‘TM’ trademark symbol to display correctly in an email subject line. Using html_entity_decode() with different charsets didn’t work, but directly replacing the entity with it’s ASCII equivalent did:

$subject = str_replace(‘™’, chr(153), $subject);

the references to ‘chr()’ in the example unhtmlentities() function should be changed to unichr, using the example unichr() function described in the ‘chr’ reference (http://php.net/chr).

the reason for this is characters such as € which do not break down into an ASCII number (that’s the Euro, by the way).

I created this function to filter all the text that goes in or comes out of the database.

function filter_string ( $string , $nohtml = » , $save = » ) <
if(!empty( $nohtml )) <
$string = trim ( $string );
if(!empty( $save )) $string = htmlentities ( trim ( $string ), ENT_QUOTES , ‘ISO-8859-15’ );
else $string = html_entity_decode ( $string , ENT_QUOTES , ‘ISO-8859-15’ );
>
if(!empty( $save )) $string = mysql_real_escape_string ( $string );
else $string = stripslashes ( $string );
return( $string );
>
?>

I just ran into the:
Bug #27626 html_entity_decode bug — cannot yet handle MBCS in html_entity_decode()!

The simple solution if you’re still running PHP 4 is to wrap the html_entity_decode() function with the utf8_decode() function.

= ‘ ‘ ;
$utf8_encode = utf8_encode ( html_entity_decode ( $string ));
?>

By default html_entity_decode() returns the ISO-8859-1 character set, and by default utf8_decode().

http://us.php.net/manual/en/function.utf8-decode.php
«Converts a string with ISO-8859-1 characters encoded with UTF-8 to single-byte ISO-8859-1»

I wrote in a previous comment that html_entity_decode() only handled about 100 characters. That’s not quite true; it only handles entities that exist in the output character set (the third argument). If you want to get ALL HTML entities, make sure you use ENT_QUOTES and set the third argument to ‘UTF-8’.

If you don’t want a UTF-8 string, you’ll need to convert it afterward with something like utf8_decode(), iconv(), or mb_convert_encoding().

If you’re producing XML, which doesn’t recognise most HTML entities:

When producing a UTF-8 document (the default), then htmlspecialchars(html_entity_decode($string, ENT_QUOTES, ‘UTF-8’), ENT_NOQUOTES, ‘UTF-8’) (because you only need to escape and & unless you’re printing inside the XML tags themselves).

Otherwise, either convert all the named entities to numeric ones, or declare the named entities in the document’s DTD. The full list of 252 entities can be found in the HTML 4.01 Spec, or you can cut and paste the function from my site (http://inanimatt.com/php-convert-entities.php).

Handy function to convert remaining HTML-entities into human readable chars (for entities which do not exist in target charset):

function cleanString ( $in , $offset = null )
<
$out = trim ( $in );
if (!empty( $out ))
<
$entity_start = strpos ( $out , ‘&’ , $offset );
if ( $entity_start === false )
<
// ideal
return $out ;
>
else
<
$entity_end = strpos ( $out , ‘;’ , $entity_start );
if ( $entity_end === false )
<
return $out ;
>
// zu lang um eine entity zu sein
else if ( $entity_end > $entity_start + 7 )
<
// und weiter gehts
$out = cleanString ( $out , $entity_start + 1 );
>
// gottcha!
else
<
$clean = substr ( $out , 0 , $entity_start );
$subst = substr ( $out , $entity_start + 1 , 1 );
// š => «s» / š => «_»
$clean .= ( $subst != «#» ) ? $subst : «_» ;
$clean .= substr ( $out , $entity_end + 1 );
// und weiter gehts
$out = cleanString ( $clean , $entity_start + 1 );
>
>
>
return $out ;
>
?>

This is a safe rawurldecode with utf8 detection:

function utf8_rawurldecode ( $raw_url_encoded ) <
$enc = rawurldecode ( $raw_url_encoded );
if( utf8_encode ( utf8_decode ( $enc ))== $enc ) <;
return rawurldecode ( $raw_url_encoded );
>else <
return utf8_encode ( rawurldecode ( $raw_url_encoded ));
>
>
?>

If you need something that converts &#[0-9]+ entities to UTF-8, this is simple and works:

/* Entity crap. /
$input = «Fovič»;

/* Plain UTF-8. */
echo $output ;
?>


We were having very peculiar behavior regarding foreign characters such as e-acute.

However, it was only showing up as a problem when extracting those characters out of our mysql database and when being displayed through a proxy server of ours that handles dns issues.

As other users have made a note of, the default character setting wasn’t what they were expecting it to be when they left theirs blank.

When we changed our default_charset to «UTF-8», our problems and needs for using functions like these were no longer necessary in handling foreign characters such as e-acute. Good enough for us!

The following function decodes named and numeric HTML entities and works on UTF-8. Requires iconv.

function decodeHtmlEnt($str) <
$ret = html_entity_decode($str, ENT_COMPAT, ‘UTF-8’);
$p2 = -1;
for(;;) <
$p = strpos($ret, ‘&#’, $p2+1);
if ($p === FALSE)
break;
$p2 = strpos($ret, ‘;’, $p);
if ($p2 === FALSE)
break;

if (substr($ret, $p+2, 1) == ‘x’)
$char = hexdec(substr($ret, $p+3, $p2-$p-3));
else
$char = intval(substr($ret, $p+2, $p2-$p-2));

Use the following to decode all entities:
( $string , ENT_QUOTES | ENT_XML1 , ‘UTF-8’ ) ?>

I’ve checked these special entities:
— double quotes («)
— single quotes (‘ and ‘)
— non printable chars (e.g. )
With other $flags some or all won’t be decoded.

It seems that ENT_XML1 and ENT_XHTML are identical when decoding.

When using this function, it’s a good idea to pay attention when it says that leaving the charset parameter empty is «not recommended».

I had an issue where I was storing text files, with entities converted, into a database. When I retrieved them later and ran

the entities were NOT decoded.

Once I was aware of the problem, I changed the decode call to fully specify all of the parameters:

$text_file = html_entity_decode($text_data, ENT_COMPAT | ENT_HTML5,’utf-8′);

This converted the entities as expected.

I wanted to use this function today and I found the documentation, especially about the flags, not particularly helpful.

Running the code below, for example, failed because the flag I used was the wrong one.

$string = ‘Donna’s Bakery’;
$title = html_entity_decode($string, ENT_HTML401, ‘UTF-8’);
echo $title;

The correct flag to use in this case is ENT_QUOTES.

My understanding of the flag to use is the one that would correspond to the expected, converted outcome. So, ENT_QUOTES for a character that would be a single or double quote when converted. and so on.

Please help make the documentation a bit clearer.

преобразование специальных символов с html_entity_decode не работает

У меня есть сайт php, где я экспортирую некоторые данные в файл PDF. Сайт использует файл fpdf для создания pdf файла, но некоторые специальные символы не отображаются корректно в созданном pdf файле.

Трудность в том, что некоторые специальные символы печатаются правильно, а другие нет. Default_charset сайта «iso-8859-1», а файлы php кодируются в «ANSI». Я также напечатал массив с информацией (которую я получаю из базы данных), и это нормально. Итак, я думаю, что-то с fpdf? Но странно, что один и тот же особый персонаж печатается некорректно в некоторых местах и неправильно в других.


Я обнаружил это в этом фрагменте кода, что строки получили плохое кодирование:

Строки в порядке до html_entity_decode, где только некоторые из них теряют специальные символы. Вы знаете, что можно сделать? Должен ли я использовать другой метод?

Преобразование сущностей HTML в соответствующие им символы

2 ответа

Это было двойное кодирование, поэтому вам нужно дважды декодировать как & необходимо декодировать в & для того, чтобы получить так далее.

Если вы выполняете кодирование, посмотрите на параметр $double_encode для htmlspecialchars() и htmlentities() .

Если кодируется несколько раз, вы можете использовать:

Попробуйте использовать «htmlspecialchars_decode ()» вместо «html_entity_decode ()»

Преобразование тегов в HTML сущности

Когда необходимо опубликовать исходный HTML код у себя в статье на сайте, то часто браузер указанный текст понимает как код, то есть выполняет его. Решить проблему должны специально выделенные для этого теги PRE и CODE. Но если у вас что-то пошло не так, то в этой статье я расскажу, как преобразовать HTML теги в сущности (в изображения), чтобы они не воспринимались браузером как команды.

Написание HTML тегов

Как известно все HTML теги начинаются с левой угловой скобки (знак меньше). Если ее заменить на ее код-сущность, то браузер уже не будет воспринимать дальнейший текст как код тега.

Чтобы код отображался как текст, а не понимался браузером как команды, достаточно заменить следующие спецсимволы на их сущности:

  • [exec]echo htmlspecialchars(« », ENT_QUOTES);[/exec] на [exec]echo htmlspecialchars(«>», ENT_QUOTES);[/exec]
  • [exec]echo htmlspecialchars(‘»‘, ENT_QUOTES);[/exec] на [exec]echo htmlspecialchars(«»», ENT_QUOTES);[/exec]
  • [exec]echo htmlspecialchars(«&», ENT_QUOTES);[/exec] на [exec]echo htmlspecialchars(«&», ENT_QUOTES);[/exec]

Таблица специальных символов и коды их сущностей

Символ (вид) Цифровой код HTML-код CSS-код Описание
\003C Знак «меньше чем» (начало тега)
> > > \003E Знак «больше чем» (конец тега)
« « « \0022 Двойная кавычка
& & & \0026 Амперсанд

Теги PRE CODE XMP

Немного о тегах которые должны помочь, но не помогут или являются невалидными.

Необязательный второй аргумент quote_style определяет режим обработки одиночных и двойных кавычек. В режиме по умолчанию, ENT_COMPAT, преобразуются двойные кавычки, одиночные остаются без изменений. В режиме ENT_QUOTES преобразуются и двойные, и одиночные кавычки. а в режиме ENT_NOQUOTES и двойные, и одиночные кавычки остаются без изменений.

Если у вас WordPress, то используйте функцию esc_html_e().

На экране в обоих случая будет выведено:

То есть код будет отображаться, а не выполняться.

Благодарности

При написании статьи были использованы следующие источники:

Илон Маск рекомендует:  Что такое код lseek
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL