wxMessageBox("Hello, world!");
wxMessageBox(L"Salut \u00E0 toi!"); // U+00E0 is "Latin Small Letter a with Grave"

注意,与wxWidgets一起使用的窄字符串通常被认为是当前语言环境编码,因此写入

wxMessageBox("Salut à toi!");

如果用户系统上使用的编码与ISO-8859-1不兼容,则无法工作(对于gcc,即使源代码是在不同的地区编译的)。特别是,在现代Unix系统下最常用的编码是UTF-8,由于上面的字符串不是有效的UTF-8字节序列,在这种情况下根本不会显示任何内容。因此,重要的是永远不要在程序源代码中直接使用8位(而不是7位)字符,而是使用宽字符串,或者写:

wxMessageBox(wxString::FromUTF8("Salut \xC3\xA0 toi!"));// in UTF8 the character U+00E0 is encoded as 0xC3A0

以类似的方式,wxString以wchar_t或char字符缓冲区的形式提供对其内容的访问。当然,后者只在字符串包含当前语言环境编码中可表示的数据时才有效。如果字符串最初是由一个窄字符串构造的,或者它只包含7位ASCII数据,但如果不是这样,就不能保证转换成功。与上面的wxString::FromUTF8()示例一样,您总是可以使用wxString::ToUTF8()来检索UTF-8编码的字符串内容—这与使用当前语言环境转换为char*不同,它不会失败。
有关wxString如何工作的更多信息,请参见wxString概述。
总而言之,wxWidgets中的Unicode支持对于应用程序来说是透明的,如果您使用wxString对象来存储程序中的所有字符数据,实际上没有什么特别的事情要做。但是,您应该了解以下部分所涉及的潜在问题。

wxWidgets在所有系统下默认使用wxString实现中的系统wchar_t。因此,在Microsoft Windows下,UCS-2 (UTF-16的简化版本,不支持代理字符)在这个平台上被用作wchar_t是2字节。在Unix系统下,包括Mac OS X,默认使用UCS-4(也称为UTF-32),但是也可以通过传递-enable-utf8选项进行配置来构建wxWidgets在内部使用UTF-8。
wxString提供的接口与内部使用的格式是独立的。然而,不同的格式有特定的优点和缺点。值得注意的是,在Unix下,底层图形工具包(例如GTK+)通常使用UTF-8编码的字符串,并且对wxWidgets中的字符串使用相同的表示形式,这样就可以避免每次在UI中显示或从中检索字符串时将UTF-32转换为UTF-8,反之亦然。对于小字符串,这种转换的开销通常可以忽略不计,但对于某些程序来说可能很重要。如果你相信它将有利于使用utf - 8的字符串在您的特定应用程序,你可能重建wxWidgets使用utf - 8作为解释上面(注意,这是目前不支持微软的Windows操作系统下,可以说是没有多大意义的Windows本身并不使用utf - 16和utf - 8),但一定要注意性能影响(见使用utf - 8)性能的影响,使用utf - 8 wxString之前这样做!
一般来说,您应该只在特定的环境中使用非默认的UTF-8构建,例如,在资源受限的系统中,转换的开销(以及与欧洲语言的UTF-32相比,UTF-8的内存使用量减少)可能很重要。如果您的程序正在运行的环境是在你的控制之下——通常情况下这样的场景——考虑确保系统总是使用utf - 8语言环境和使用-enable-utf8only配置选项来禁用支持其他地区和考虑所有字符串utf - 8。这进一步减少了代码的大小,并且在更多的情况下不需要转换。
Unicode相关的预处理器符号
现在将wxUSE_UNICODE定义为1,以表示对Unicode的支持。可以在MSW的setup.h中显式地将其设置为0,也可以在Unix下使用-disable-unicode,但强烈建议不要这样做。默认情况下,wxUSE_UNICODE_WCHAR也被定义为1,但是在UTF-8构建中(在前一节中描述),它被设置为0,而通常为0的wxUSE_UNICODE_UTF8被设置为1。在后一种情况下,wxUSE_UTF8_LOCALE_ONLY也可以设置为1,表示所有字符串都被认为是UTF-8。

// first test, using exotic characters outside of the Unicode BMP:
wxString test = wxString::FromUTF8("\xF0\x90\x8C\x80");// U+10300 is "OLD ITALIC LETTER A" and is part of Unicode Plane 1// in UTF8 it's encoded as 0xF0 0x90 0x8C 0x80
// it's a single Unicode code-point encoded as:
// - a UTF16 surrogate pair under Windows
// - a UTF8 multiple-bytes sequence under Linux
// (without considering the final NULL)
wxPrintf("wxString reports a length of %d character(s)", test.length());// prints "wxString reports a length of 1 character(s)" on Linux// prints "wxString reports a length of 2 character(s)" on Windows// since wxString on Windows doesn't have surrogate pairs support!
// second test, this time using characters part of the Unicode BMP:
wxString test2 = wxString::FromUTF8("\x41\xC3\xA0\xE2\x82\xAC");// this is the UTF8 encoding of capital letter A followed by// 'small case letter a with grave' followed by the 'euro sign'
// they are 3 Unicode code-points encoded as:
// - 3 UTF16 code units under Windows
// - 6 UTF8 code units under Linux
// (without considering the final NULL)
wxPrintf("wxString reports a length of %d character(s)", test2.length());// prints "wxString reports a length of 3 character(s)" on Linux// prints "wxString reports a length of 3 character(s)" on Windows

为了更好地解释上述内容,请考虑上述示例的第二个字符串;它由3个字符和最后的NULL组成:

可以看到,UTF16编码很简单(对于BMP中的字符),在本例中,UTF16编码的wxString占用8个字节。UTF8编码更详细,在本例中使用了7个字节。
一般来说,对于包含很多拉丁字符的字符串,UTF8在内存占用方面比UTF16有很大的优势,但是对于一些常见的操作,如长度计算,则需要更多的处理。
最后,请注意,wxString用于存储Unicode代码单元(wchar_t或char)的类型总是类型指定为wxStringCharType。

可这样使用UTF8中文

const wchar_t* a =L"欢迎使用wxWidgets!";
SetStatusText(wxString(a));
 wxMessageBox(L"我的第一个程序",L"关于 Hello World", wxOK | wxICON_INFORMATION );
const wchar_t* a =L"欢迎使用wxWidgets!";
SetStatusText(a);

wxWidgets随笔(7)-utf8中文(3)相关推荐

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

    当使用Microsoft Visual c++时不能编译,需要更改为使用mb_str()(这对于包含Unicode字符的文件名无效,请考虑使用wxWidgets类和函数来处理这些文件名,因为标准c++ ...

  2. wxWidgets随笔(5)-utf8中文(1)

    在wxWidgets 3.0中对Unicode的支持已经发生了根本的变化,很多与以前版本的库相关的现有资料已经不再正确. 臭名昭著的宏wxT()和_T()不再需要了.基本上,您可以从任何使用它们的代码 ...

  3. wxWidgets随笔(9)-utf8~wxString存储二进制数据(4)

    使用wxString存储二进制数据 可以使用函数wxString::To8BitData和wxString::From8BitData来存储二进制数据(即使它包含空值). 注意,即使允许使用NUL字符 ...

  4. mysql substr 中文字符_解析使用substr截取UTF-8中文字符串出现乱码的问题

    我们知道有时候使用substr来截取UTF-8中文字符串的时候,经常会出现乱码,为什么会出现这样的问题呢,本文告诉你答案. 看这样一段代码吧(字符编码为UTF-8): $str = '都知道strle ...

  5. php 邮件乱码,解决PHP mail发送UTF-8中文邮件乱码

    在这里,我将解决一个问题,也许很多人遇到过,困惑又不知道如何去做的问题. 如何发送中文邮件时没有乱码? 在这里我将告诉你如何发送UTF-8编码格式的中文电子邮件.本文不涉及GBK编码或者GB2312编 ...

  6. 解决 Docker Image的UTF-8中文字符集的问题(以Oracle为例)

    解决 Docker Image的UTF-8中文字符集的问题(以Oracle为例) 参考文章: (1)解决 Docker Image的UTF-8中文字符集的问题(以Oracle为例) (2)https: ...

  7. Android Studio项目编码设置为GBK或UTF-8  中文乱码 和 Eclipse项目编码设置

    Android Studio项目编码设置为GBK或UTF-8  中文乱码 1.打开File->Setting->Editor->File Encoding 进行编码设置 (只能影响你 ...

  8. linux unicode utf8.h,linux shell下16进制 “\uxxxx” unicode to UTF-8中文

    问题出现背景: 项目中有个通过ip获取归属地城市需求,我是直接通过新浪的ip归属查询接口来获取的.我使用的是shell脚本调用 RESULT=$(curl -s 'http://int.dpool.s ...

  9. MYSQL使用UTF8中文乱码终极解决办法

    转自:http://wenku.baidu.com/view/d2d4f15ba8114431b80dd81f.html MYSQL使用UTF8中文乱码终极解决办法   作者:刘明灵 liumingl ...

最新文章

  1. python16进制字节序_第 1 章 套接字、IPv4和简单的客户端/服务器编程
  2. 电脑上怎么配置mysql数据库服务器_Mysql数据库服务器安装与配置详解教程
  3. linux c用open打开(创建)一个文件
  4. LeetCode 2096. 从二叉树一个节点到另一个节点每一步的方向(最小公共祖先)
  5. C语言 基础60题(2)——二维数组操作
  6. QT_StepByStep(2)--滑动杆的实现
  7. php启动端口修改,PHP_启动服务端口报错
  8. Xcode创建头文件
  9. 微型计算机b5040电源板,联想b5040一体机电源用普通ATX电源改的该法
  10. 室友哪些不该看的东西被你无意之间看到了?
  11. 电子商务网站建设系统战略规划报告
  12. quorum examples初探
  13. 软件测试之语音识别(ASR)测试
  14. axure 动态面板 自动适应浏览器宽度_动态面板之“固定到浏览器”与“自适应窗口宽度”特性解读图文教程(18)...
  15. 数据库分库分表,分片配置轻松入门!
  16. matlab 怎样画颜色渐变曲线
  17. C#中使用Invalidate()与MouseMove方法刷新控件时,控件闪烁问题解决方法
  18. html字体怎么变大,网页字体怎么变大(html怎么改字体类型)
  19. Cisco Firepower NGFW FTD Software 7.0.0
  20. DXperience 711 代码问题

热门文章

  1. 我是一只IT小小鸟读书笔记
  2. 【移动开发】安卓Lab2(01)
  3. 大型互联网网站架构心得之:分、并、换
  4. 新一轮的心情整理(有二年没来这里了)
  5. 对南昌杀人案的一些看法
  6. 17-比赛1 A - Weak in the Middle (栈)
  7. IdentityServer4【Introduction】之支持的规范
  8. IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream...
  9. Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志
  10. 对于初学者学习Java语言的建议(转载)