我有一个包含一些拉丁词,特殊字符和日语字符的字符串。该字符串是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”。
感谢您的帮助!
答案 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;
}