此八位位组流如何解释为希伯来语UTF-8编码?

| 以下字节流由UTF-8标识,其中包含希伯来语句子:“ 0”。我正在尝试了解编码。
ubuntu@ip-10-126-21-104:~$ od -t x1 homeless-title-fromwireshark_followed_by_hexdump.txt
0000000 0a 09 d7 93 d7 99 d7 a8 d7 95 d7 aa 20 d7 9c d7
0000020 a9 d7 95 d7 aa d7 a4 d7 99 d7 9d 20 20 d7 91 d7
0000040 aa d7 9c 20 d7 90 d7 91 d7 99 d7 91 20 2d 20 d7
0000060 94 d7 95 d7 9e d7 9c d7 a1 0a
0000072
ubuntu@ip-10-126-21-104:~$ file -i homeless-title-fromwireshark_followed_by_hexdump.txt
homeless-title-fromwireshark_followed_by_hexdump.txt: text/plain; charset=utf-8
该文件为UTF-8,我已通过打开记事本(Windows 7),输入希伯来语字符
ד
并保存文件来对此进行了验证。其结果产生以下结果:
ubuntu@ip-10-126-21-104:~$ od -t x1 test_from_notepad_utf8_daled.txt
0000000 ef bb bf d7 93
0000005
ubuntu@ip-10-126-21-104:~$ file -i test_from_notepad_utf8_daled.txt
test_from_notepad_utf8_daled.txt: text/plain; charset=utf-8
其中“ 4”是以utf-8格式编码的BOM,而“ 5”正是在“ 6”之后出现在原始流中的字节序列(换行,ascii中的制表符)。 这里的问题是,通过unicode代码页,应将
ד
编码为
05 D3
,为什么utf-8编码为什么以及如何变成
d7 93
? 二进制中的
d7 93
11010111 10010011
,而 二进制中的
05 D3
00000101 11010011
我似乎找不到适合这些编码的正确转换,(据我所知)代表相同的Unicode实体,即\“ HEBREW LETTER DALET \” 谢谢, 格言。     
已邀请:
        Unicode代码点U + 0000..U + 007F以UTF-8编码为单字节0x00..0x7F。 Unicode代码点u + 0080..U + 07FF(包括HEBREW LETTER DALET U + 05D3)以UTF-8编码为两个字节。如xxxxxyyyyyy所示,这些二进制值可以分为5位和6位。 UTF-8表示的第一个字节的位模式为110xxxxx;第二个具有位模式10yyyyyy。
0x05D3 = 0000 0101 1101 0011 
0x05D3的最后6位是010011;以10开头的前缀表示1001 0011或0x93。 前5位为10111;以110开头的前缀,则给出1101 0111或0xD7。 因此,用于U + 05D3的UTF-8编码为0xD7 0x93。 对于U + 0800向上的Unicode代码点,还有更多规则,它们需要3或4(但不更多)字节的UTF-8表示形式。连续字节始终具有10yyyyyy位模式。第一个字节的位模式为1110xxxx(3个字节值)和11110xxx(4个字节值)。有许多字节值不能出现在有效的UTF-8中。它们是0xC0、0xC1和0xF5..0xFF。     
        Unicode定义(其中包括)一堆“代码点”,并为每个代码点赋予一个数值。
HEBREW LETTER DALET
的值是U + 05D3或
0x05D3
。但这只是一个数字,并且不会告诉您如何“编码”文件/内存中的代码点(即一组实际位)... UTF-8(以及UTF) -16,UTF-32和其他各种方案)告诉您如何执行此操作。 实际上,有一种将Unicode代码点转换为UTF-8字符的公式化方法(但这是一个完全不同的SO问题)。事实证明,在UTF-8中,“ 15”被编码为“ 18”。顺便说一句,如果找到允许您另存为UTF-32或UCS-4的文本编辑器,您会发现(除了非常大的文件之外)您用十六进制编辑器看到的字节应该匹配Unicode规范中的代码点。 此页面可能会提供有关该字符的某些表示的一些额外信息。 要对Unicode进行出色的介绍,我建议Joel Spolsky的《每个软件开发人员绝对绝对肯定要了解Unicode和字符集的绝对最低要求》(无借口!)。     
        传统代码页定义了一组字符及其到字节序列的映射。 Unicode将字符集和字符编码的概念分开。 因此,Unicode字符集是代码点的列表。每个代码点都分配有一个唯一值作为标识符-“ 2”是U + 05D3。 编码-Unicode转换格式-描述如何将每个代码点编码为一系列代码单元。 UTF-8使用一个1字节的代码单元,并且代码点被编码为一个和四个字节之间的序列。 RFC 3629中描述了该算法。 对于使用2字节代码单元的UTF-16,存在类似的过程-每个代码点为两个或四个字节。对于UTF-32,除了将每个值设置为四个字节长之外,没有任何其他事情。这些编码可以采用大尾数形式,所以U + 05D3在UTF-32中可能是
00 00 05 D3
D3 05 00 00
。 BOM表通常用于告诉您正在使用哪种编码,如果数据的编码不明确,则字节序是什么。 还有UTF-7,但我从未在野外看到它。     

要回复问题请先登录注册