UTF8与UTF16对比char *对比什么?有人向我解释这个烂摊子!

时间:2008-10-05 15:22:07

标签: string utf-8 character-encoding utf-16 multibyte

我设法忽略了所有这些多字节字符的东西,但现在我需要做一些UI工作,我知道我在这方面的无知将赶上我!任何人都可以在几段或更少的段落中解释我需要知道什么,以便我可以本地化我的应用程序?我应该使用哪些类型(我同时使用.Net和C / C ++,我需要Unix和Windows的答案)。

5 个答案:

答案 0 :(得分:76)

查看Joel Spolsky的 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

EDIT 20140523 :另外,请观看汤姆斯科特在YouTube上的 Characters, Symbols and the Unicode Miracle - 这只是不到十分钟,并且对精彩的'黑客'进行了精彩的解释那是UTF-8

答案 1 :(得分:25)

字符编码由一系列代码组成,每个代码都从给定的字符集中查找符号。请参阅Wikipedia on character encoding上的这篇好文章。

UTF8 (UCS) 为每个符号使用1到4个字节。 Wikipedia给出了多字节纲要如何工作的一个很好的概述:

  
      
  • 单字节字符的最高位始终为0.
  •   
  • 多字节序列的第一个字节的最高有效位   确定序列的长度。   这些最重要的位是110   对于双字节序列; 1110 for   三字节序列,依此类推。
  •   
  • 多字节序列中的剩余字节最多为10   有意义的。
  •   
  • UTF-8流既不包含字节FE也不包含FF。这确保了   UTF-8流看起来不像UTF-16   流以U + FEFF开头   (字节顺序标记)
  •   

该页面还显示了每种字符编码类型的优缺点之间的比较。

UTF16 (UCS2)

每个符号使用2个字节到4个字节。

UTF32 (UCS4)

每个符号总是使用4个字节。

char 仅表示数据字节,而不是实际编码。它与UTF8 / UTF16 / ascii不相似。 char *指针可以指任何类型的数据和任何编码。

<强> STL:

stl的std :: wstring和std :: string都不适用于 可变长度的字符编码,如UTF-8和UTF-16。

如何实施:

看一下iconv库。 iconv是一个强大的字符编码转换库,用于libxml等项目(Gnome的XML C解析器)

关于字符编码的其他重要资源:

答案 2 :(得分:12)

Received wisdom表明Spolsky的文章忽略了几个要点。

建议本文更完整: The Unicode® Standard: A Technical Introduction

这篇文章也是一个很好的介绍:Unicode Basics

后者特别概述了Unicode的字符编码形式和方案。

答案 3 :(得分:4)

各种UTF标准是编码“代码点”的方法。代码点是Unicode字符集的索引。

另一种编码是UCS2,它总是16位,因此不支持完整的Unicode范围。

很高兴知道一个代码点不等于一个字符。例如,诸如å之类的字符既可以表示为代码点,也可以表示为两个代码点,一个用于a,一个用于环。

比较两个unicode字符串因此需要规范化以在比较之前获得规范表示。

答案 4 :(得分:1)

字体也存在问题。处理字体有两种方法。您可以使用带有字形的巨大字体来表示您需要的所有Unicode字符(我认为最新版本的Windows带有一两个这样的字体)。或者您使用som库,它能够组合专用于Unicode标准子集的各种字体的字形。