【问题标题】:UTF8 Hex Codepoint to Decimal MismatchUTF8 十六进制代码点与十进制不匹配
【发布时间】:2017-09-06 03:53:31
【问题描述】:

我正在开发一个程序,它采用 unicode 字符的十六进制值并将其转换为整数,然后转换为字节数组,然后转换为 UTF-8 字符串。除了以下事实之外,一切都很好,例如,十六进制值 E2 82 AC(€ 符号)是十进制的 14 844 588,但是,如果您在下面提供的网页上查看它的代码点值,它是 226 130 172,相差很大。

http://utf8-chartable.de/unicode-utf8-table.pl?start=8320&number=128&names=-

如果您按十进制对它们的值进行排序,它们不仅仅是将十六进制转换为十进制。显然我并不像我想象的那样理解编码。

E2 82 AC 映射到 226 130 172 而不是 14 844 588。

为什么会出现这种差异?

提前致谢。

【问题讨论】:

  • 您不能将可变长度的字节序列直接解释为数字。 0x00E282AC 确实是 14844588 但这只是巧合。
  • 十六进制的字节序列0xE20x820xAC分别是十进制的226130172。单个数字14,844,588(注意逗号,它们只是您问题中的空格)是十六进制的0xE282AC。十进制数是226130172,而不是226,130,172。你在比较两个不同的东西。你让空间迷惑了你。

标签: unicode encoding utf-8 hex


【解决方案1】:

我认为您的说法“十六进制值 E2 82 AC(€ 符号)是十进制的 14 844 588”是不正确的。

您如何解释十六进制值 E282AC

十六进制 E2 = 十六进制 E * 16 + 十六进制 2 = 14 * 16 + 2 = 226。

十六进制 82 = 十六进制 8 * 16 + 十六进制 2 = 8 * 16 + 2 = 130。

十六进制 AC = 十六进制 A * 16 + 十六进制 C = 10 * 16 + 12 = 172。

因此,十六进制值 E2 82 AC(€ 符号)实际上是十进制的 226 130 172。

【讨论】:

    猜你喜欢
    • 2020-06-15
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2011-06-10
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多