Unicode编码

Jon*_*son 3 unicode

我有一个问题,如果程序不先验地知道所使用的编码,程序如何解析字符串.

据我所知,UTF-8编码存储1个字节的ASII字符,以及最多6个(我认为是6个)字节的所有其他字符.因此,例如,两个空格将作为0x2020存储在存储器中.

那么,程序如何能够确定此字符串与使用UTF-16编码编码的字符串`0x2020之间的差异,该编码对应于单个字符,该字符显然是与有时用于表示伴随的符号类似的字符.数学运算符(我只是在这里查看).

似乎解析器总是必须事先知道字符串的编码.如果是这样,这在实践中如何实施?在每个字符串之前是否有一个字节告诉解析器使用了什么编码?

In *_*ico 7

通常,不可能仅仅基于可以表示文本的字节流来确定所使用的确切编码.但是,如果某处有字节顺序标记,您至少可以使用它作为使用什么编码的提示.

但是,如果文本的制作者和消费者之间没有任何提示或某种合同/交换元数据,那么你就无法100%肯定.您可以尝试使用启发式算法,但如果您最终猜错了,那么您会遇到这些问题.

如果您想要确定,请在文本的生产者和使用者之间设置某种协议或契约,以便知道文本编码方案.您可以对编码方案进行硬编码(例如,您的程序可能会解析UTF-8并且只能解析UTF-8),或者确保文本的生成者始终在前面添加字节顺序标记或专门设计的头字节来传达编码方案.

  • @Jonathan Gleason:这当然是特定于平台的.例如,Windows API中的`CreateWindowExW()`函数需要UTF-16编码的字符串,无论语言本身如何处理字符串. (3认同)
  • @Jonathan Gleason - 不同的语言不会以相同的方式处理字符串 - [详情](http://illegalargumentexception.blogspot.com/2010/04/i18n-comparing-character-encoding-in-c.html).不同的平台/容器/ API可以添加它们自己的条件/约束. (2认同)