我设法忽略了所有这些多字节字符的东西,但现在我需要做一些UI工作,我知道我在这方面的无知将赶上我!任何人都可以在几段或更少的段落中解释我需要知道什么,以便我可以本地化我的应用程序?我应该使用哪些类型(我同时使用.Net和C / C ++,我需要Unix和Windows的答案)。
答案 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开头 (字节顺序标记)
该页面还显示了每种字符编码类型的优缺点之间的比较。
每个符号使用2个字节到4个字节。
每个符号总是使用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标准子集的各种字体的字形。