Javascript UTF-8与UTF-16和UTF-32转换混淆

Javascript UTF-8与UTF-16和UTF-32转换混淆,javascript,html,node.js,utf-8,computer-science,Javascript,Html,Node.js,Utf 8,Computer Science,我对unicode字符到十六进制值的转换有点困惑 我正在使用这个网站获取字符的十六进制值。() 如果我加上“A”并转换,那么我得到如下结果: 0041 --> UTF-16 00000041 --> UTF-32 41 --> UTF-8 00065 --> Decimal Value 上述输出是有意义的,因为我们可以将所有这些十六进制值转换为65 现在,如果我输入“Я”(不带引号)并将其转换,那么得到的值如下 042f --> UTF-16 0000042f -

我对unicode字符到十六进制值的转换有点困惑

我正在使用这个网站获取字符的十六进制值。()

如果我加上“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二进制值不同的原因吗??)


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的一部分


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

您对字符编码的工作原理了解得太多了。他们每个人都有自己的标准。您应该比较标准,而不是从样本输出中得出结论。例如,UTF-16上的standand会告诉您它也是可变长度编码,您好@TomBlodget您是对的,它们都是可变长度编码UTF-8和UTF-16。因为我是一名计算机科学专业的学生,我喜欢学习这些东西的幕后工作,所以我对它们有了更多的了解。例如,您链接的站点上显示“\x61\xe4\xb8\xad\xd0\xaf”是UTF-8。它不是Unicode文本中的标准符号,它在不同的语言中有不同的含义。它将是一个C或C++字符串文字,编译器的执行字符集为UTF-8。它可以作为Python字节字符串,但不能作为字符串。这意味着JavaScript中的不同字符。在许多语言中,这是无效的。非常感谢,在阅读你的答案之前,我也读了一篇博客文章,其中为我清除了它,但你的答案进一步清除了一些内容。非常感谢