33

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

4

5 回答 5

76

查看 Joel Spolsky 的《每个软件开发人员绝对、绝对必须了解 Unicode 和字符集的绝对最小值》(没有借口!)

编辑 20140523:另外,在 YouTube 上观看 Tom Scott的 Characters, Symbols and the Unicode Miracle - 不到 10 分钟,精彩的解释是 UTF-8 的“hack”

于 2008-10-05T15:25:30.643 回答
25

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

UTF8 (UCS)对每个符号使用 1 到 4 个字节。 Wikipedia很好地概述了多字节列表的工作原理:

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

该页面还向您展示了每种字符编码类型的优缺点之间的很好比较。

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 解析器)等项目使用

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

于 2008-10-05T15:28:22.680 回答
12

公认的智慧表明,斯波尔斯基的文章遗漏了几个要点。

建议这篇文章更完整: Unicode® 标准:技术介绍

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

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

于 2008-10-05T17:07:51.513 回答
4

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

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

还好知道一个代码点不等于一个字符。例如,像 å 这样的字符既可以表示为一个代码点,也可以表示为两个代码点,一个用于 a,一个用于 ring。

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

于 2008-10-05T15:47:39.740 回答
1

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

于 2008-10-05T15:50:45.553 回答