За последние 24 часа нас посетили 16976 программистов и 1295 роботов. Сейчас ищут 1472 программиста ...

Интеграция на корейском языке

Тема в разделе "PHP для профи", создана пользователем nekit44, 18 апр 2023.

  1. nekit44

    nekit44 Активный пользователь

    С нами с:
    27 дек 2015
    Сообщения:
    39
    Симпатии:
    2
    Всем привет.

    Интегрирую через api сервис, который отвечает на корейском языке. Ключи на английском а значения корейский.
    Если результат ответа json передать в функцию json_decode, ошибка: Malformed UTF-8 characters, possibly incorrectly encoded

    Если через функцию:
    mb_convert_encoding($this>response, 'UTF-8', 'UTF-8');
    То json удается распарсить без ошибок, но пропадает часть иероглифов, замещаемые знаком вопроса.

    Подскажите может кто сталкивался, как по максимуму сохранить иероглифы
    Спасибо
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.859
    Симпатии:
    749
    Адрес:
    Татарстан
    А вы узнайте в какой кодировке корейские символы иероглифы явно они в utf8 обычный не входят... Че-нить как минимум utf8_mb4 а может и другая
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.112
    Симпатии:
    1.244
    Адрес:
    там-сям
    Для корейского языка есть варианты не уникодной кодировки. https://dicom.nema.org/dicom/2013/output/chtml/part05/chapter_I.html
    Если же всё-таки уникод, он может быть запакован в UTF-8 (размер символов разный) или не запакован (каждый символ 32 bit).

    Для сохранения азиатских символов в UTF-8, насколько я знаю, используют 4 байта. Если эти тексты сохраняются в базу MySQL, то надо в ней выбирать utf8_mb4.
     
  4. nekit44

    nekit44 Активный пользователь

    С нами с:
    27 дек 2015
    Сообщения:
    39
    Симпатии:
    2
    Спасибо

    Решение json стал работать
    PHP:
    1.  private function json_encode_unicode($data): mixed
    2.     {
    3.         if (defined('JSON_UNESCAPED_UNICODE')) {
    4.             return json_encode($data, JSON_UNESCAPED_UNICODE);
    5.         }
    6.         return preg_replace_callback('/(?<!\\\\)\\\\u([0-9a-f]{4})/i',
    7.             function ($m) {
    8.                 $d = pack("H*", $m[1]);
    9.                 $r = mb_convert_encoding($d, "UTF8", "UTF-16BE");
    10.                 return $r !== "?" && $r !== "" ? $r : $m[0];
    11.             }, json_encode($data)
    12.         );
    13.     }
     
    artoodetoo нравится это.
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.112
    Симпатии:
    1.244
    Адрес:
    там-сям
    Есть сомнение насчет выпиливания неудобных символов, но если тебе подходит...
     
  6. nekit44

    nekit44 Активный пользователь

    С нами с:
    27 дек 2015
    Сообщения:
    39
    Симпатии:
    2
    Не заметил, посмотрю внимательно) Спасибо