一.

Qt5假定的执行字符集是UTF8,不再允许用户擅自改动。这样一来,Qt4中setCodecXXX的各种副作用不再存在,而且中文问题更为简单。

QString s1 = "汉语";

QString s2("漢語");

QString s3 = tr("中文")

QString s4 = QStringLiteral("中文");//只要字符串不需要翻译,请关注这个

QString s5 = QString::fromWCharArray(L"中文");

QString s6 = u8"中文";//C++11

QString s7 = tr(u8"中文")

...

所有这些在Qt5默认都会正常工作,唯一要求就是:确保你的C++的执行字符集(the execution character set)是UTF-8

被误用最多的:此种方法解析结果是错误的

在Qt4中,QObject::tr()是被滥用(误用)的函数之一:

QString s3 = tr("中文")

...

原因:

在Qt4,不少用户被铺天盖地的setCodecForTr()所影响,进而靠它来解决中文问题。

它的用途是用来进行翻译(I18N和L10N)的,如果你没有这方面的需求,真的没必要用它。(在Qt4中,我只注意到有2个大陆网友和1个日本网友有需求并真正进行过这方面的尝试,那么其他应该算误用吧?)

让人困惑的wchar_t

刚开始接触Qt和QString时,曾多次想过,为什么不用wchar_t,为什么,...

QString s5 = QString::fromWCharArray(L"中文");

这个东西在Windows下真的很有用:首先它是Windows系统API所用字符串,其次它和QString内部表示相同。但是由于MSVC处于种种考虑,鼓励大家使用TEXT/_T,反倒使大家对它比较陌生。

但是从C++标准来说,wchar_t毕竟不是char16_t,所以跨平台性不好。在linux下,这行代码需要utf32到utf16的转换。

QStringLiteral

这是一个宏,一个蛮复杂的宏:

QString s4 = QStringLiteral("中文");

之前?

在介绍这个宏之前,我们先看看下面写法有什么劣势:

QString s1 = "汉语";

QString s2("漢語");

QString s3 = tr("中文")

QString s6 = u8"中文";//C++11

...

首先,2个汉字的字符串以UTF-8编码的形式被编译器放到了常量区。(至少占7个字节吧?)

然后,程序运行时,构造QString实例,需要在堆上申请空间,存放utf16格式的相应字符串。

有没有存在浪费?

方案

QString 内部是UTF16,如果C++编译器在编译期直接提供了UTF16的字符串,那么我们在QString内部直接保存也就够了。这样

省掉存在两份不同的拷贝(即相应的转换,malloc的成本)

对汉字来说,UTF16本身就是UTF8省空间

现实

目前,我们还没有可靠的方式在C++使用UTF16的执行字符集(the execution character set)。

尽管 L"..."(wchar_t*) 在Windows下是UTF16,但是不具备跨平台性。

C++11可以保证这一点,u"..."(char16_t),但主流编译器尚未提供完美支持。

这两点,导致了QStringLiteral的复杂性

实现

源码见 qtbase/src/corelib/tools/qstring.h

(代码中使用宏、模板、lambda表达式,还是相当复杂的,此处只摘片段)

如果编译器支持char16_t,则直接使用

#define QT_UNICODE_LITERAL_II(str) u"" str

typedef char16_t qunicodechar;

...

否则。如果在Windows平台下,或者在其他的wchar_t宽度为2的环境下,使用wchar_t

#if defined(Q_CC_MSVC)

# define QT_UNICODE_LITERAL_II(str) L##str

#else

# define QT_UNICODE_LITERAL_II(str) L"" str

#endif

typedef wchar_t qunicodechar;

...

否则。编译器不支持,Qt作为一个库,肯定也没有办法

# define QStringLiteral(str) QString::fromUtf8(str, sizeof(str) - 1)

qt 判断字符串中是否含有中文字符_Qt 中文字符串问题相关推荐

  1. Excel如何判断某单元格或者字符串中是否包含某些字符?

    1.判断字符串是否含有某字符,区分大小写 比如判断字符串中是否包含大写字母A,可用公式=IF(ISNUMBER(FIND("A",A2)),"有"," ...

  2. python中指定最后一个字符_如何从Python字符串中删除最后一个字符?

    如何从Python字符串中删除最后一个字符? Python支持负索引切片和正切片.负索引从  -1 到-(iterable_length)开始.我们将使用负切片从可迭代对象的末尾获取元素. 索引  - ...

  3. MATLAB 判断字符串中是否含有特定的字符

    这个程序的目的是,逐行读取file.txt文件中的字符串,并判断字符串中是否含有特定的字符,如果含有,再对字符串进行处理,然后写入到新的TXT文档中new_file.txt [plain] view ...

  4. Java代码判断字符串中是否含有表情

    最近在发微信公众号模版消息时遇到一个问题,如果用户的nickname中有表情,那么消息的字体颜色就会发生变化,像这样: 这个问题应该是微信的问题,所以我们不能解决掉这个bug,只能等腾讯爸爸来修复.唯 ...

  5. 【转】SQL函数:字符串中提取数字,英文,中文,过滤重复字符

    SQL函数:字符串中提取数字,英文,中文,过滤重复字符 --提取数字 IF OBJECT_ID('DBO.GET_NUMBER') IS NOT NULL DROP FUNCTION DBO.GET_ ...

  6. kotlin中判断字符串_Kotlin程序删除字符串中所有出现的字符

    kotlin中判断字符串 Given a string and a character, we have to remove all occurrences of the character in g ...

  7. 判断字符串中是否包含指定字符(JavaScript)

    判断字符串中是否包含指定字符 indexOf() indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置.如果要检索的字符串值没有出现,则返回 -1. search() search( ...

  8. Python 判断列表中是否含有给定字符串

    问题 在数据预处理或纠错的过程中可能会用到对列表中是否含有我们需要的字符串的判断. 方法 直接上代码!!! # 创建列表 List = ['Lu','Xiao','Yang','Qi']# 判断列表中 ...

  9. 算法刷题——字符串| 给定一个字符类型数组chas[],判断chas中是否所有的字符都只出现过一次

    import java.util.Optional;/*** Author:SunLala* Date: 2022/3/26* 功能描述:(给定一个字符类型数组chas[],判断chas中是否所有的字 ...

最新文章

  1. 听安全专家讲如何黑掉黑客的故事
  2. prototype.js 让你更深入的了解javascript的面向对象特性
  3. 九、Golang并发和线程模型
  4. 我对NHibernate的感受(3):有些尴尬的集合支持
  5. 【整理】3dsMax中毒了怎么办
  6. 今天是星期一,两天后是星期三,5天后是星期六;今天是星期六,3天后是星期二。
  7. java: You aren‘t using a compiler supported by lombok, so lombok will not work and has been disabled
  8. 如何用Word制作流程图(一)
  9. 传奇GOM引擎登录器配置教程
  10. 香水白皮书指出,中国香水消费客单价远超美欧市场
  11. 计算机mac是什么,修改计算机的MAC地址有什么用
  12. 简单的小程序聊天对话窗口界面
  13. 利用CRM客户管理系统抓住销售商机
  14. 基于SpringBoot 的CMS系统,大家可以拿去开发企业官网
  15. 【椭球大地测量学】Python及MATLAB实现贝塞尔大地问题正反解计算编程(含流程图)
  16. java连接fdb文件_fdb文件扩展名,fdb文件怎么打开?
  17. phpexcel 应用, 设置单元格格式, 设置下拉列表,透视表(VLOOKUP), 受保护列
  18. 开发了一个可以上班偷偷看小说的阅读器,欢迎大家批正
  19. orcale 多行多列合并为多行一列
  20. DundasDashboard与微软PerformancePoint 2010差异比较

热门文章

  1. SAP License:集团化企业多准则多报告的实现
  2. DTO概念的了解和使用
  3. 珍爱网产品经理:为年轻人创造私密、高效的社交空间
  4. 接口电子器件中的光耦合器模块
  5. 关于协方差矩阵:算什么的怎么算
  6. 谁的青春不迷茫 致在下小苏 20多岁的人,今天就这样了,明天只会更好,不会更差了吧 ! 也是致自己
  7. python - 在线答题程序
  8. 消费金融产业链全景图
  9. 中断控制流水灯c语言程序,51单片机按键中断控制流水灯
  10. 阿里开源百万级数据导出Excel表格 三步简单导出 附官方文档