八位字节到十六进制的Unicode字符

时间:2010-10-04 19:30:21

标签: php unicode utf-8

八位字节中的Unicode字符类似于110xxxxx 10xxxxxx。如何以十六进制表示法转换这些八位字节,如U + XXXX?

2 个答案:

答案 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流中可能有三种八位字节:

  • 10xxxxxx - 尾随八位字节
  • 0xxxxxxx - ASCII字符
  • 110xxxxx,1110xxxx等 - 序列中的前导八位字节。

前导和尾随八位字节的序列用于编码128及以上的Unicode点。 110xxxxx表示它启动两个八位字节的序列,1110xxxx启动三个八位字节的序列,等等。这样您就可以将序列彼此隔离。然后从序列中的所有八位字节中取x,这是你的Unicode代码点。