PHP конвертировать японский в гекс - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть строка, состоящая из нескольких латинских слов, специальных символов и японских символов.Строка в кодировке UTF-8.Я хотел бы преобразовать все в гекс.

Я пробовал несколько подходов, но каким-то образом японские символы не были преобразованы правильно.Все остальное преобразуется правильно.

В качестве примера я хочу преобразовать японские символы для «теста», которые выглядят так: テ ス ト

Когда я пытаюсь использовать эту функцию:

     function utf8StringToHexString($string) {
       $nums = array();
       $convmap = array(0x0, 0xffff, 0, 0xffff);
       $strlen = mb_strlen($string, "UTF-8");
       for ($i = 0; $i < $strlen; $i++) {
       $ch = mb_substr($string, $i, 1, "UTF-8");
       $decimal = substr(mb_encode_numericentity($ch, $convmap, "UTF-8"), -5, 4);
       $nums[] = "" .base_convert($decimal, 10, 16). ";";
       }
       return implode("", $nums);
   }

Я получаю «9b6; 9a9; 9b8».

Когда я пытаюсь:

function strToHex($string)
          {
              $hex='';
              for ($i=0; $i < strlen($string); $i++)
              {
                  $hex .= dechex(ord($string[$i]));
              }
              return $hex;
          }

, я получаю «e38386e382b9e38388», который на найденной мной странице перехода был помечен как «шестнадцатеричный»utf-8 ".

То, что я хотел бы иметь, это" 30 C6 30 B9 30 C8 ", который на той же странице конверсии помечен как" шестнадцатеричное сырье ".Когда я запускаю функцию utf8StringToHexString для латинского текста, я получаю вывод «шестнадцатеричное необработанное».

когда я запускаю mb_detect_encoding (), он выводит «UTF-8» как для латинских, так и для японских символов.

спасибо за помощь!

1 Ответ

0 голосов
/ 19 сентября 2018

Проверьте этот рефакторинг вашей второй функции:

 /**
 * @param $string
 * @return string
 */
function strToHex($string){
    $hex = '';
    for ($i = 0; $i < strlen($string); $i++) {
        $hex .= dec2hex(ord($string[$i])) . ' ';
    }
    return $hex;
}

/**
 * @param $number
 * @return string
 */
function dec2hex($number){
    $hexvalues = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
    $hexval = '';
    while ($number != '0') {
        $hexval = $hexvalues[bcmod($number, '16')] . $hexval;
        $number = bcdiv($number, '16', 0);
    }
    return $hexval;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...