String UTF8与UTF16与字符*与什么?有人给我解释一下这一团糟!
我已经设法忽略了所有这些多字节字符的东西,但现在我需要做一些UI工作,我知道我在这方面的无知将赶上我!有人能用几段或更少的篇幅来解释我需要知道什么,以便我能够本地化我的应用程序吗?我应该使用什么类型(我同时使用.Net和C/C++,我需要Unix和Windows的答案)。查看Joel Spolsky的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字符编码由一系列代码组成,每个代码从给定的字符集中查找一个符号
编辑20140523:另外,在YouTube上观看Tom Scott创作的——时间不到十分钟,这是一个精彩的“黑客”解释,即UTF-8字符编码由一系列代码组成,每个代码从给定的字符集中查找一个符号。请看这篇好文章 每个符号使用1到4个字节。给出了多字节运行方式的详细说明:
- 单字节字符的最高有效位始终为0
- 多字节序列的第一个字节的最高有效位 确定序列的长度。 这些最高有效位是110 对于双字节序列;1110 三字节序列,等等
- 多字节序列中的其余字节的两个最大值为10 有效位
- UTF-8流既不包含字节FE也不包含字节FF。这确保了 UTF-8流从来不像UTF-16 从U+FEFF开始的流 (字节顺序标记)
- (首先由@Dylan Beattie提及)
因此,比较两个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培训。谢谢你的链接