如何在PHP中以UTF-16BE格式编码字符串?对于“演示消息!!!”编码的字符串应为'00440065006D006F0020004D00650073007300610067006'。另外,我需要将阿拉伯字符编码为这种格式。
答案 0 :(得分:5)
首先,绝对不是UTF-8,它只是一个字符集(即一种在内存中存储字符串/显示它们的方法)。
这里的内容看起来像是用于构建每个字符的字节转储。
如果是这样,您可以通过这种方式获取这些字节:
$str = utf8_encode("Demo Message!!!");
for ($i=0 ; $i<strlen($str) ; $i++) {
$byte = $str[$i];
$char = ord($byte);
printf('%02x ', $char);
}
你会得到以下输出:
44 65 6d 6f 20 4d 65 73 73 61 67 65 21 21 21
但是,再一次,这不是UTF-8:在UTF-8中,就像我在给出的示例中看到的那样,D
只存储在一个字节上:0x44
在您发布的内容中,它使用两个字节存储:0x00 0x44
。
也许你正在使用某种UTF-16?
经过多次测试后编辑和@ aSeptik的评论:这确实是UTF-16。
要获得您正在获得的转储类型,您必须确保您的字符串以UTF-16编码,这可以通过这种方式完成,例如使用mb_convert_encoding
函数:
$str = mb_convert_encoding("Demo Message!!!", 'UTF-16', 'UTF-8');
然后,只需迭代生成此字符串的字节,然后像我之前那样转储它们的值:
for ($i=0 ; $i<strlen($str) ; $i++) {
$byte = $str[$i];
$char = ord($byte);
printf('%02x ', $char);
}
您将获得以下输出:
00 44 00 65 00 6d 00 6f 00 20 00 4d 00 65 00 73 00 73 00 61 00 67 00 65 00 21 00 21 00 21
您发布的内容类似于: - )
(你只需删除printf
调用中的空格 - 我让它在那里更容易阅读输出=)
答案 1 :(得分:0)
E.g。使用mbstring扩展名及其mb_convert_encoding()函数。
$in = 'Demo Message!!!';
$out = mb_convert_encoding($in, 'UTF-16BE');
for($i=0; $i<strlen($out); $i++) {
printf("%02X ", ord($out[$i]));
}
打印
00 44 00 65 00 6D 00 6F 00 20 00 4D 00 65 00 73 00 73 00 61 00 67 00 65 00 21 00 21 00 21
或使用iconv()
$in = 'Demo Message!!!';
$out = iconv('iso-8859-1', 'UTF-16BE', $in);
for($i=0; $i<strlen($out); $i++) {
printf("%02X ", ord($out[$i]));
}