Преобразование HTML-объектов в UTF-8 в SHIFT JIS
Я работаю с веб-сайтом, который должен ориентироваться на старые японские мобильные телефоны, которые не поддерживают Unicode. Проблема в том, что текст для сайта сохраняется в базе данных в виде HTML-объектов(т. е. Эту базу данных абсолютно невозможно изменить, так как она используется для нескольких сотен сайтов.
Что мне нужно сделать, так это преобразовать эти сущности в реальные символы, а затем преобразовать строковую кодировку перед отправкой, так как телефоны отображают сущности, не преобразуя их первый.
Я пробовал и mb_convert_encoding
, и iconv
, но все, что они делают, это преобразуют кодировку сущностей, но не создают текст.
Заранее спасибо
Правка:
Я тоже пробовал html_entity_decode
. Она дает те же самые результаты - необращенная струна.
Желаемого результата: シェラトン・ヌーサリゾート&スパ
HTML-коды: シェラトン・ヌーサリゾート&スパ
Выходные данные html_entity_decode([the string above],ENT_COMPAT,'SHIFT_JIS');
идентичны входной строке.
4 ответа:
Просто позаботьтесь о том, чтобы создавать правильные кодовые точки из сущностей. Если исходная кодировка UTF-8, например:
$originalEncoding = 'UTF-8'; // that's only assumed, you have not shared the info so far $targetEncoding = 'SHIFT_JIS'; $string = '... whatever you have ... '; // superfluous, but to get the picture: $string = mb_convert_encoding($string, 'UTF-8', $originalEncoding); $string = html_entity_decode($string, ENT_COMPAT, 'UTF-8'); $stringTarget = mb_convert_encoding($string, $targetEncoding, 'UTF-8');
Я нашел эту функцию на php.net , это работает для меня с вашим примером:
function unhtmlentities($string) { // replace numeric entities $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string); $string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string); // replace literal entities $trans_tbl = get_html_translation_table(HTML_ENTITIES); $trans_tbl = array_flip($trans_tbl); return strtr($string, $trans_tbl); }
Я думаю, вам просто нужно
html_entity_decode
.Edit: на основе вашего редактирования:
Обратите внимание, что это только ваш первый шаг, чтобы преобразовать ваши сущности в реальные символы.$output = preg_replace_callback("/(&#[0-9]+;)/", create_function('$m', 'return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); '), $original_string);
Просто для участия, поскольку я столкнулся с какой-то ошибкой кодирования во время кодирования, я бы предложил этот фрагмент:
$string_to_encode=" your string "; if(mb_detect_encoding($string_to_encode)!==FALSE){ $converted_string=mb_convert_encoding($string_to_encode,'UTF-8'); }
Может быть, не самый лучший для большого объема данных, но все же работает.