String UTF8与UTF16与字符*与什么?有人给我解释一下这一团糟!

String UTF8与UTF16与字符*与什么?有人给我解释一下这一团糟!,string,utf-8,character-encoding,utf-16,multibyte,String,Utf 8,Character Encoding,Utf 16,Multibyte,我已经设法忽略了所有这些多字节字符的东西,但现在我需要做一些UI工作,我知道我在这方面的无知将赶上我!有人能用几段或更少的篇幅来解释我需要知道什么,以便我能够本地化我的应用程序吗?我应该使用什么类型(我同时使用.Net和C/C++,我需要Unix和Windows的答案)。查看Joel Spolsky的 编辑20140523:另外,在YouTube上观看Tom Scott创作的——时间不到十分钟,这是一个精彩的“黑客”解释,即UTF-8字符编码由一系列代码组成,每个代码从给定的字符集中查找一个符号

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

查看Joel Spolsky的


编辑20140523:另外,在YouTube上观看Tom Scott创作的——时间不到十分钟,这是一个精彩的“黑客”解释,即UTF-8

字符编码由一系列代码组成,每个代码从给定的字符集中查找一个符号。请看这篇好文章

每个符号使用1到4个字节。给出了多字节运行方式的详细说明:

  • 单字节字符的最高有效位始终为0
  • 多字节序列的第一个字节的最高有效位 确定序列的长度。 这些最高有效位是110 对于双字节序列;1110 三字节序列,等等
  • 多字节序列中的其余字节的两个最大值为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库。是一个强大的字符编码转换库,用于(Gnome的XML C解析器)等项目

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

  • (首先由@Dylan Beattie提及)

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

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

值得一提的是,一个代码点并不等于一个字符。例如,像å这样的字符既可以表示为一个代码点,也可以表示为两个代码点,一个表示a,一个表示环


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

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

表明斯波尔斯基的文章忽略了几个要点

建议更完整地介绍这篇文章:

本文也是一篇很好的介绍:


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

Brian,这是错误的。UTF-16使用2到4个字节。只有UTF-32具有固定的字节宽度(=4)。大多数的UTF16实现都不仅仅是扩展到BMP之外,因此只支持有限的字符集。个人而言,我会考虑使用char *指向UTF16数据是一个bug。例如,如果我将其视为数据缓冲区,我认为这没有问题。@Konrad Rudolph:这些UTF-16实现没有超出BMP,它们不是UTF-16,而是UCS-2。我想到了Windows女士。UTF-16支持完整的Unicode范围。也许语言有一个“char”类型的事实只是字符编码简单得多的时代留下的痕迹。使用“char”或“wchar”或任何固定宽度的类型来表示字符可能不是一个好主意。也许新语言不应该有“char”,而应该只有uint8\u t或byte。我通常使用uint8_t*,或void*来指向我认为是“字节包”的数据,就像一个字符串,其中我将编码存储在其他变量中。呵呵,当我阅读标题时,这正是我想到的文章。我以前没有读过这篇文章。。。通过其他途径接受我的i18n培训。谢谢你的链接