Преобразование 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 2

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');
 }

Может быть, не самый лучший для большого объема данных, но все же работает.