Php конвертировать в ISO-8859-9 - PullRequest
0 голосов
/ 15 июня 2009

Я использую JSON для кодирования массива и получаю строку, подобную этой:

{"name":"\u00fe\u00fd\u00f0\u00f6\u00e7"}

Теперь мне нужно преобразовать это в ISO-8859-9. Я попробовал следующее, но это не удалось:

header('Content-type: application/json; charset=ISO-8859-9');
$json = json_encode($response);
$json = utf8_decode($json);
$json = mb_convert_encoding($json, "ISO-8859-9", "auto");
echo $json;

Кажется, это не работает. Чего мне не хватает?

Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 15 июня 2009

Вы можете сделать:

$json = json_encode($response);
header('Content-type: application/json; charset=ISO-8859-9');
echo mb_convert_encoding($json, "ISO-8859-9", "UTF-8");

Предполагая, что строки в $response находятся в utf-8. Но я настоятельно рекомендую, чтобы вы просто использовали utf-8 до конца.

Редактировать: Извините, только что понял, что это не будет работать, так как json_encode экранирует точки Unicode как escape-коды JavaScript. Сначала вам придется преобразовать их в последовательности utf-8. Я не думаю, что для этого есть какие-либо встроенные функции, но вы можете использовать слегка измененный вариант этой библиотеки , чтобы туда попасть. Попробуйте следующее:

function unicode_hex_to_utf8($hexcode) {
  $arr = array(hexdec(substr($hexcode[1], 0, 2)), hexdec(substr($hexcode[1], 2, 2)));
  $dest = '';
  foreach ($arr as $src) {
    if ($src < 0) {
      return false;
    } elseif ( $src <= 0x007f) {
      $dest .= chr($src);
    } elseif ($src <= 0x07ff) {
      $dest .= chr(0xc0 | ($src >> 6));
      $dest .= chr(0x80 | ($src & 0x003f));
    } elseif ($src == 0xFEFF) {
      // nop -- zap the BOM
    } elseif ($src >= 0xD800 && $src <= 0xDFFF) {
      // found a surrogate
      return false;
    } elseif ($src <= 0xffff) {
      $dest .= chr(0xe0 | ($src >> 12));
      $dest .= chr(0x80 | (($src >> 6) & 0x003f));
      $dest .= chr(0x80 | ($src & 0x003f));
    } elseif ($src <= 0x10ffff) {
      $dest .= chr(0xf0 | ($src >> 18));
      $dest .= chr(0x80 | (($src >> 12) & 0x3f));
      $dest .= chr(0x80 | (($src >> 6) & 0x3f));
      $dest .= chr(0x80 | ($src & 0x3f));
    } else {
      // out of range
      return false;
    }
  }
  return $dest;
}

print mb_convert_encoding(
  preg_replace_callback(
    "~\\\\u([1234567890abcdef]{4})~", 'unicode_hex_to_utf8',
    json_encode($response)),
  "ISO-8859-9", "UTF-8");
1 голос
/ 15 июня 2009

Как вы можете видеть на сайте документации PHP Функции кодирования / декодирования JSON работают только с кодировкой utf8, поэтому попытка изменить это может вызвать проблемы с данными, вы можете получить неожиданные и неправильные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...