2011-10-11 60 views
0

由于字符可以由2字节或更多字节(2字节的序列)表示,所以Unicode代码单元可以具有可变大小。因此,如果以二进制格式存储,程序如何知道如何读取它们?程序如何读取unicode?

让我们假设一个'由0F0F 13F3代表和“b”是由02AD BC39 09F3 459F

如果我把它们写在文件foo.txt的表示:

0F0F 13F3 02AD BC39 09F3 459F 

那么我将如何知道在哪里停止'a'和'b'?

这里的人我正在谈论阅读,写纯粹的Unicode,即没有将其转换为任何其他格式基于流行的字符集,如utf-8。

+1

在讨论Unicode时,术语很重要:您将代码单元,代码点和字符模糊在一起(它们是三个不同的术语)。一旦决定编码(UTF-8,UTF-16,UTF-32)码单元是固定长度的。 (1,2和4个字节)然而,代码点可能需要UTF-8和UTF-16中的多个代码单元。除了下面的好答案,请参阅unicode.org/glossary – Thanatos

+0

@Thanatos谢谢你帮助我。 –

回答

3

首先,并非所有的Unicode表示都是可变长度的。 UTF-32和USC-2是固定长度的。 UTF-8和UTF-16各自以各自的方式变长。其次,如果你阅读了规范,你会发现序列是自描述的。可以是第一个字节的字节值(UTF-8中的)不能是第二个或第三个字节等等。代替UTF-16中的非BMP字符的替代对也是如此。

2

常用的编码是UTF-8。它的结构方式是字符字节的某些预定义位告诉你是否有更多的字节来。

查看http://en.wikipedia.org/wiki/UTF-8#Design一个很好的图。

+0

我有兴趣阅读Unicode,因为它没有编码成任何字符集。 –

+1

Unicode是一组字符定义,而不是编码。 UTF-7,UTF-8,UTF-16,UTF-32,这些都是Unicode的编码。你在二进制数据中处理的是编码。在阅读之前,您需要确定使用哪种编码。有时候数据前面有一个BOM来告诉你编码。如果不是,那么你必须依靠外部信息来知道编码是什么。 –