wxWidgets随笔(6)-utf8中文(2)

自作多情 提交于 2020-01-21 04:32:43

当使用Microsoft Visual c++时不能编译,需要更改为使用mb_str()(这对于包含Unicode字符的文件名无效,请考虑使用wxWidgets类和函数来处理这些文件名,因为标准c++库不支持它们)。
另一类不兼容的更改是由于修改了一些虚方法来使用wxString参数而不是const wxChar参数,从而使它们同时接受窄字符串和宽字符串。这不是一个问题,如果你只是调用这些函数,但你需要改变签名的派生类版本,如果你覆盖他们,否则他们不会被调用了。再次强调,确保这个问题不出现的最佳方法是使用警告函数签名不匹配的编译器重新构建代码(可以使用-Woverloaded-virtual g++选项)。
最后,一些结构字段,如著名的wxCmdLineEntryDesc::shortName、longName和description字段已被更改为const char
类型,而不是const wxChar*类型,因此,如果将wxT()或_T()与它们的初始化器一起使用,则需要删除它们。
Unicode是什么?
Unicode是一种字符编码标准,它解决了以前标准(如ASCII标准)的缺点,使用8位、16位或32位对每个字符进行编码。这使得有足够的代码点(参见下面的定义)一次性编码所有世界语言。更多关于Unicode的细节可以在http://www.unicode.org/找到。
从实用的角度来看,在为国际用户编写应用程序时,使用Unicode几乎是必需的。此外,任何读取它没有生成的文件或从网络中从其他服务接收数据的应用程序都应该准备好处理Unicode。
Unicode表示和术语
在使用Unicode时,定义一些术语的含义非常重要。
字形是表示字符或字符的一部分的特定图像(通常是字体的一部分)。任何字符可以有一个或多个关联的字形;例如,大写字母“A”可能包含的符号有:
在这里插入图片描述
Unicode为几乎所有现有的字母/脚本中的每个字符分配一个数字,这个数字称为代码点;它通常在文档手册和Unicode网站上表示为U+xxxx,其中xxxx是十六进制数。
注意,通常一个字符只分配一个代码点,但也有例外;所谓的预组合字符(参见http://en.wikipedia.org/wiki/Precomposed_character)或连接。在这些情况下,单个“字符”可能映射到多个代码点,反之亦然,多个字符可能映射到单个代码点。
Unicode标准将所有可能的代码点的空间划分为平面;一个平面的范围是65,536(1000016)个连续的Unicode编码点。平面编号从0到16,其中第一个平面是BMP,即基本多语言平面。BMP包含所有现代语言的字符和大量特殊字符。其他平面实际上主要包含历史脚本、特殊用途字符或未使用的字符。
代码点在计算机内存中表示为一个或多个代码单元的序列,其中一个代码单元是一个内存单元:8、16或32位。更准确地说,代码单元是表示用于处理或交换的编码文本单元的最小位组合。
UTF或Unicode转换格式是将Unicode代码点映射到代码单元序列的算法。其中最简单的是UTF-32,其中每个代码单元由32位(4字节)组成,每个代码点总是由单个代码单元(固定长度编码)表示。(注意,即使UTF-32也不是完全无关紧要的,因为小端和大端架构的映射是不同的)。UTF-32通常在Unix系统下用于Unicode字符串的内部表示。
另一个非常普遍的标准是UTF-16,它被Microsoft Windows使用:它使用16位编码单元(2字节)编码第一个(大约)64千个Unicode编码点(BMP平面),并使用一对16位编码单元来编码后面的字符。这些对被称为代理。因此,UTF16使用可变数量的代码单元来编码每个代码点。
最后,用于外部Unicode存储(例如文件和网络协议)的最广泛的编码是UTF-8,它是面向字节的,因此避免了UTF-16和UTF-32的endianness二义性。UTF-8使用8位(1字节)的代码单位;在通常的英文字母之外的代码点使用可变的字节数表示,这使得它在内部表示方面的效率低于UTF-32。
作为理解到目前为止所描述的各种概念之间的差异的可视化帮助,查看相同代码点的不同UTF表示:

在这里插入图片描述
在这种特殊情况下,UTF8需要比UTF16更多的空间(3字节而不是2字节)。
请注意,从C/ c++程序员的角度来看,由于标准类型wchar_t(通常用于表示C/ c++中的Unicode(“宽”)字符串)并不是在所有平台上都具有相同的大小,所以情况更加复杂。它在Unix系统下是4字节,与使用UTF-32的传统相对应,但在Windows下只有2字节,这是与使用UTF-16的操作系统兼容所必需的。
通常使用UTF8时,代码单元被存储到char类型中,因为几乎所有系统上的char都是8位宽的;使用UTF16时,通常将代码单元存储在wchar_t类型中,因为wchar_t在所有系统上至少是16位的。这也是wxString使用的方法。有关更多信息,请参见wxString概述。
参见http://unicode.org/glossary/获得上述术语的官方定义。
wxWidgets中的Unicode支持
默认情况下总是使用Unicode
由于wxWidgets 3.0 Unicode支持始终是启用的,虽然构建没有它的库仍然是可能的,但不建议再使用它,并且在不久的将来将不再支持它。这意味着只在内部使用Unicode字符串,在Microsoft Windows下使用Unicode系统API,这意味着wxWidgets程序需要Microsoft层才能在Windows 95/98/ME上运行Unicode。
但是,与以前版本的wxWidgets的Unicode构建模式不同,这种支持基本上是透明的:即使也支持宽字符串(即utf16编码的wchar_t或utf8编码的char),您仍然可以继续使用窄字符串(即当前本地语言环境编码的char*)。任何wxWidgets函数都接受这两种类型的参数,因为这两种类型的字符串都被隐式地转换为wxString

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!