Преобразование HTML-объектов в UTF-8 в SHIFT_JIS - PullRequest
2 голосов
/ 19 июля 2011

Я работаю с веб-сайтом, который должен быть нацелен на старые японские мобильные телефоны, для которых не включен Unicode.Проблема в том, что текст для сайта сохраняется в базе данных как объекты HTML (т. Е. Ӓ).Эта база данных абсолютно не может быть изменена, так как она используется для нескольких сотен веб-сайтов.

Что мне нужно сделать, это преобразовать эти объекты в реальные символы, а затем преобразовать строковое кодирование перед отправкой, как это делают телефонысущности без их предварительного преобразования.

Я пробовал и mb_convert_encoding, и iconv, но все, что они делают, - это преобразование кодировки сущностей, но не создание текста.

Заранее спасибо

РЕДАКТИРОВАТЬ:

Я также пытался html_entity_decode.Это приводит к тем же результатам - не преобразованная строка.

Вот пример данных, с которыми я работаю.

Требуемый результат:HTML-коды: シェラトン・ヌーサリゾート&スパ

Вывод html_entity_decode([the string above],ENT_COMPAT,'SHIFT_JIS'); идентичен входной строке.

Ответы [ 4 ]

2 голосов
/ 19 июля 2011

Просто позаботьтесь, чтобы вы создавали правильные кодовые точки из сущностей.Если исходная кодировка 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');
1 голос
/ 19 июля 2011

Я нашел эту функцию на 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);
}
0 голосов
/ 16 июля 2016

просто для участия, так как я столкнулся с некоторой ошибкой кодирования во время кодирования, я бы предложил этот фрагмент:

 $string_to_encode=" your string ";
 if(mb_detect_encoding($string_to_encode)!==FALSE){
      $converted_string=mb_convert_encoding($string_to_encode,'UTF-8');
 }

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

0 голосов
/ 19 июля 2011

Я думаю, вам просто нужно html_entity_decode.

Редактировать: На основании ваших правок:

$output = preg_replace_callback("/(&#[0-9]+;)/", create_function('$m', 'return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); '), $original_string); 

Обратите внимание, что этотолько ваш первый шаг, чтобы преобразовать ваши сущности в настоящие символы.

...