1

如何在 PHP 中以 UTF-16BE 格式编码字符串?对于“演示消息!!!” 编码的字符串应该是“00440065006D006F0020004D00650073007300610067006”。另外,我需要将阿拉伯字符编码为这种格式。

4

2 回答 2

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

在您发布的内容中,它使用两个 Bytes : 存储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- 我让它在那里以获得更易于阅读的输出=)

于 2010-05-01T10:27:20.903 回答
0

例如,通过使用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]));
}
于 2010-05-01T10:33:21.777 回答