以下格式转换为十六进制的正确代码是什么?

时间:2017-11-12 08:35:43

标签: php hexdump

我正在尝试使用我们的本地运营商api将bengali文本作为短信发送。但是它们不支持将unicode(utf-8)文本作为post / get参数。他们回答说:

  

对于每个孟加拉语字母表,都有标准的HEXDUMP表示   需要插入消息内容部分。

     

如下所示孟加拉语单词低于HEXDUMP表示

     

বাংলাদেশ:09AC09BE098209B209BE09A609C709B6

所以,我尝试了两个从SO收集的代码。

代码-1:

$strBN = 'বাংলাদেশ';
echo bin2hex($strBN);
//it reutrns this value "e0a6ace0a6bee0a682e0a6b2e0a6bee0a6a6e0a787e0a6b6"

代码-2:

$strBN = 'বাংলাদেশ';
echo fToHex($strBN);
function fToHex($string)
{
    $strHData = '';
    for ($i = 0; $i < strlen($string); $i++)
    {
        $strHData .= str_pad(dechex(ord($string[$i])), 2, '0', STR_PAD_LEFT);
    }
    return $strHData;
}
//This also return same value as above "e0a6ace0a6bee0a682e0a6b2e0a6bee0a6a6e0a787e0a6b6"

所以,我的问题是如何将该文本/字符串转换为hexdump作为我的载体所期望的。

1 个答案:

答案 0 :(得分:3)

您获得的十六进制转储是UTF-8格式,这是一种在8位流中可靠地表示Unicode字符的方法。

E0 A6 AC E0 A6 BE E0 A6 82 E0 A6 B2 E0 A6 BE E0 A6 A6 E0 A7 87 E0 A6 B6

另一方面,示例是转储UTF-16(或截断的16位Unicode代码点)值:

09AC 09BE 0982 09B2 09BE 09A6 09C7 09B6

在您的情况下,解决方案是转换为UTF-16编码:

echo bin2hex(mb_convert_encoding('বাংলাদেশ', 'UTF-16'));"
> 09ac09be098209b209be09a609c709b6

请注意,在代码中使用Unicode字符是不可靠的,因为字符串中字节的解释将取决于您的系统详细信息/编辑器/编译器或解释器设置等。