这个八位字节流如何被解释为希伯来语UTF-8编码?

时间:2011-05-27 14:45:35

标签: unicode encoding utf-8 character-encoding hebrew

以下字节流由UTF-8标识,它包含希伯来语句子:דירות לשותפים בתל אביב - הומלס。我正在尝试理解编码。

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

其中ef bb bf是以utf-8格式编码的BOM,d7 93正好是0a 09之后原始流中显示的字节序列(新行,ascii中的制表符)

这里的问题是,通过unicode代码页,ד应编码为05 D3,那么为什么以及如何将utf-8编码变为d7 93

二进制文件中的

d7 9311010111 10010011,而
二进制05 D300000101 11010011

我似乎无法找到对这些编码有意义的正确转换,(据我的理解)代表相同的Unicode实体,即“HEBREW LETTER DALET”

谢谢你,
格言。

3 个答案:

答案 0 :(得分:6)

Unicode定义(除其他外)一堆“代码点”,并为每个代码点赋予一个数值。 HEBREW LETTER DALET的值为U + 05D3或0x05D3。但这只是一个数字,并没有告诉你如何在文件/内存中“编码”代码点(即实际位集)... UTF-8(以及UTF-16,UTF- 32和其他各种方案)告诉你如何做到这一点。

实际上有一种将Unicode代码点转换为UTF-8字符的公式化方法(但这是一个完全不同的SO问题)。事实证明,在UTF-8中,HEBREW LETTER DALET被编码为0xD7 0x93。顺便说一句,如果你找到一个允许你保存为UTF-32或UCS-4的文本编辑器,你会发现(除了一个非常大的文件)你用十六进制编辑器看到的字节应该匹配代码指向Unicode规范。

This页面可能会为该字符的某些表示提供一些额外信息。

对于Unicode的精彩介绍,我建议使用Joel Spolsky的The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

答案 1 :(得分:4)

Unicode代码点U + 0000..U + 007F以UTF-8编码为单字节0x00..0x7F。

Unicode代码点u + 0080..U + 07FF(包括HEBREW LETTER DALET U + 05D3)以UTF-8编码为两个字节。这些二进制值可以分为5位组和6位组,如xxxxxyyyyyy。 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。

对于UTF-8表示,需要3或4(但不是更多)字节的Unicode代码点U + 0800以上有更多规则。连续字节总是具有10yyyyyy位模式。第一个字节具有位模式1110xxxx(3个字节值)和11110xxx(4个字节值)。有许多字节值无法出现在有效的UTF-8中;它们是0xC0,0xC1和0xF5..0xFF。

答案 2 :(得分:2)

旧版代码页定义了一组字符及其到字节序列的映射。 Unicode分离字符集字符编码的概念。

因此,Unicode字符集是代码点的列表。每个代码点都被赋予一个唯一值作为标识符 - ד是U + 05D3。

编码 - Unicode转换格式 - 描述如何将每个代码 point 编码为一系列代码单位

UTF-8使用1个八位字节的代码单元,代码点编码为1到4个字节之间的序列。该算法在RFC 3629中描述。

UTF-16存在similar procedure,它使用2个八位字节的代码单元 - 每个代码点为2或4个字节。除了使每个值长四个字节之外,UTF-32没有任何关系。这些编码可以采用大端或小端形式,因此U + 05D3在UTF-32中可能是00 00 05 D3D3 05 00 00。 BOM通常用于说明正在使用哪种编码以及如果数据编码不明确,那么字节顺序是什么。

还有UTF-7,但我从未见过它。