八位字节中的Unicode字符类似于110xxxxx 10xxxxxx。如何以十六进制表示法转换这些八位字节,如U + XXXX?
答案 0 :(得分:3)
您可以利用iconv
的UTF-8解码器来避免自己编写一个:
function utf8_to_codepoints($s) {
return unpack('V*', iconv('UTF-8', 'UCS-4LE', $s));
}
$data= "Caf\xc3\xa9 \xe6\x97\xa5\xe6\x9c\xac \xf0\x9d\x84\x9e"; // Café 日本
var_export(utf8_to_codepoints($data));
给出:
array (
1 => 67,
2 => 97,
3 => 102,
4 => 233,
5 => 32,
6 => 26085,
7 => 26412,
8 => 32,
9 => 119070,
)
可以使用dechex
转换为U + nnnn格式。
答案 1 :(得分:1)
首先,这是document that definitively defines UTF-8 encoding。
示例中的两个八位字节:110xxxxx 10xxxxxx编码一个Unicode字符。它的二进制代码是 - 好吧,只需要取出那些x(位)并将它们放在一起。您将获得一个数字 - 以二进制形式显示,但如果需要,可以将其转换为十进制或十六进制。这与U + XXXX中的XXXX相同。
我怎么知道110xxxxx 10xxxxxx编码一个字符? UTF-8流中可能有三种八位字节:
前导和尾随八位字节的序列用于编码128及以上的Unicode点。 110xxxxx表示它启动两个八位字节的序列,1110xxxx启动三个八位字节的序列,等等。这样您就可以将序列彼此隔离。然后从序列中的所有八位字节中取x,这是你的Unicode代码点。