【问题标题】:UTF-8 vs UTF-16 and UTF-32 conversion confusionUTF-8 vs UTF-16 和 UTF-32 转换混淆
【发布时间】:2020-01-28 04:29:02
【问题描述】:

我对将 unicode 字符转换为十六进制值感到有点困惑。

我正在使用这个网站来获取字符的十六进制值。 (https://www.branah.com/unicode-converter)

如果我输入“A”并转换,那么我会得到类似的结果:

0041 --> UTF-16
00000041 --> UTF-32
41 --> UTF-8
00065 --> Decimal Value

上面的输出很有意义,因为我们可以将所有这些十六进制值转换为 65。

现在,如果我输入“Я”(不带引号)并转换它,那么我会得到类似的值。

042f --> UTF-16
0000042f --> UTF-32
d0af --> UTF-8
01071 --> Decimal Value

这个输出对我来说没有意义,因为并非所有这些十六进制值都转换回 1071。

如果您将 d0af 转换回十进制值,您将得到 53423

这让我很困惑,我一直在网上搜索有关此转换的答案,但到目前为止我还没有找到任何好的答案。

所以,我想知道这里是否有人可以提供帮助。 (这意味着很多)//提前致谢。

您还可以在下面的链接中查看此二进制转换的示例。(您能解释一下为什么上一个示例中的 utf-8 二进制值不同吗??)

http://kunststube.net/encoding/

【问题讨论】:

  • 您对字符编码的工作原理了解得太多了。他们每个人都有自己的标准。您应该比较标准,而不是从样本输出中得出结论。例如,UTF-16 的标准会告诉您它也是可变长度编码,????。
  • 嗨@TomBlodget,你是​​对的,它们都是可变长度编码 UTF-8 和 UTF-16。问题是我正在更多地了解它们,因为我是一名计算机科学专业的学生,​​我喜欢了解这些东西的幕后工作。
  • 很好,只是在外面小心点。例如,您链接的站点显示“\x61 \xe4\xb8\xad \xd0\xaf”是UTF-8。它不是 Unicode 文本讨论的标准符号,它在不同的语言中意味着不同的东西。编译器的执行字符集为 UTF-8 的 C 或 C++ 字符串文字会很好。它可以作为 Python 字节字符串,但不能作为字符串。这将意味着 JavaScript 中的不同字符。在许多语言中,它是无效的。

标签: javascript html node.js utf-8 computer-science


【解决方案1】:

UTF-8 使用可变长度编码(可以使用 1、2、3 或 4 个字节来存储单个字符)。

在这种情况下:

d0af = 11010000 10101111

110 开头告诉我们在解码时需要 2 个字节(查看示意图的第 1 列字节)。解码时,我们使用字节中第一个 0 之后的二进制数字。所以, 110x xxxx x 是我们实际 unicode 值的第一批值。每个额外的字节都遵循10xx xxxx 的模式。因此,从字节 1 和 2 中获取值,我们得到:

110[10000] 10[101111] = 
      V        V
     10000 101111 = 42f = 1071

这样做的原因是,对于普通字符,传输和存储所需的字节数更少。但在需要不常见字符的奇怪情况下,它仍然可以在 UTF-8 的一部分中使用。

如果您有任何问题,请发表评论。

【讨论】:

  • 非常感谢,在阅读您的回答之前,我还阅读了一篇博客文章,为我清除了它,但您的回答进一步清除了一些东西。非常感谢你?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2014-08-21
  • 2014-07-16
  • 1970-01-01
  • 2021-01-30
  • 2015-09-21
相关资源
最近更新 更多