PHP将日语转换为十六进制

时间:2018-09-19 09:09:12

标签: php encoding utf-8 hex

我有一个包含一些拉丁词,特殊字符和日语字符的字符串。该字符串是UTF-8编码的。我想将所有内容都转换为十六进制。

我尝试过服务器方式,但是日语字符不能正确转换。其他所有内容都正确转换。

作为一个例子,我想将“ test”的日语字符转换为如下所示:テスト

当我尝试此功能时:

     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 :(得分:0)

检查您的第二个功能的重构:

 /**
 * @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;
}