qt 判断字符串中是否含有中文字符_Qt 中文字符串问题
一.
Qt5假定的執(zhí)行字符集是UTF8,不再允許用戶擅自改動(dòng)。這樣一來(lái),Qt4中setCodecXXX的各種副作用不再存在,而且中文問題更為簡(jiǎn)單。
QString s1 = "漢語(yǔ)";
QString s2("漢語(yǔ)");
QString s3 = tr("中文")
QString s4 = QStringLiteral("中文");//只要字符串不需要翻譯,請(qǐng)關(guān)注這個(gè)
QString s5 = QString::fromWCharArray(L"中文");
QString s6 = u8"中文";//C++11
QString s7 = tr(u8"中文")
...
所有這些在Qt5默認(rèn)都會(huì)正常工作,唯一要求就是:確保你的C++的執(zhí)行字符集(the execution character set)是UTF-8
被誤用最多的:此種方法解析結(jié)果是錯(cuò)誤的
在Qt4中,QObject::tr()是被濫用(誤用)的函數(shù)之一:
QString s3 = tr("中文")
...
原因:
在Qt4,不少用戶被鋪天蓋地的setCodecForTr()所影響,進(jìn)而靠它來(lái)解決中文問題。
它的用途是用來(lái)進(jìn)行翻譯(I18N和L10N)的,如果你沒有這方面的需求,真的沒必要用它。(在Qt4中,我只注意到有2個(gè)大陸網(wǎng)友和1個(gè)日本網(wǎng)友有需求并真正進(jìn)行過這方面的嘗試,那么其他應(yīng)該算誤用吧?)
讓人困惑的wchar_t
剛開始接觸Qt和QString時(shí),曾多次想過,為什么不用wchar_t,為什么,...
QString s5 = QString::fromWCharArray(L"中文");
這個(gè)東西在Windows下真的很有用:首先它是Windows系統(tǒng)API所用字符串,其次它和QString內(nèi)部表示相同。但是由于MSVC處于種種考慮,鼓勵(lì)大家使用TEXT/_T,反倒使大家對(duì)它比較陌生。
但是從C++標(biāo)準(zhǔn)來(lái)說,wchar_t畢竟不是char16_t,所以跨平臺(tái)性不好。在linux下,這行代碼需要utf32到utf16的轉(zhuǎn)換。
QStringLiteral
這是一個(gè)宏,一個(gè)蠻復(fù)雜的宏:
QString s4 = QStringLiteral("中文");
之前?
在介紹這個(gè)宏之前,我們先看看下面寫法有什么劣勢(shì):
QString s1 = "漢語(yǔ)";
QString s2("漢語(yǔ)");
QString s3 = tr("中文")
QString s6 = u8"中文";//C++11
...
首先,2個(gè)漢字的字符串以UTF-8編碼的形式被編譯器放到了常量區(qū)。(至少占7個(gè)字節(jié)吧?)
然后,程序運(yùn)行時(shí),構(gòu)造QString實(shí)例,需要在堆上申請(qǐng)空間,存放utf16格式的相應(yīng)字符串。
有沒有存在浪費(fèi)?
方案
QString 內(nèi)部是UTF16,如果C++編譯器在編譯期直接提供了UTF16的字符串,那么我們?cè)赒String內(nèi)部直接保存也就夠了。這樣
省掉存在兩份不同的拷貝(即相應(yīng)的轉(zhuǎn)換,malloc的成本)
對(duì)漢字來(lái)說,UTF16本身就是UTF8省空間
現(xiàn)實(shí)
目前,我們還沒有可靠的方式在C++使用UTF16的執(zhí)行字符集(the execution character set)。
盡管 L"..."(wchar_t*) 在Windows下是UTF16,但是不具備跨平臺(tái)性。
C++11可以保證這一點(diǎn),u"..."(char16_t),但主流編譯器尚未提供完美支持。
這兩點(diǎn),導(dǎo)致了QStringLiteral的復(fù)雜性
實(shí)現(xiàn)
源碼見 qtbase/src/corelib/tools/qstring.h
(代碼中使用宏、模板、lambda表達(dá)式,還是相當(dāng)復(fù)雜的,此處只摘片段)
如果編譯器支持char16_t,則直接使用
#define QT_UNICODE_LITERAL_II(str) u"" str
typedef char16_t qunicodechar;
...
否則。如果在Windows平臺(tái)下,或者在其他的wchar_t寬度為2的環(huán)境下,使用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作為一個(gè)庫(kù),肯定也沒有辦法
# define QStringLiteral(str) QString::fromUtf8(str, sizeof(str) - 1)
總結(jié)
以上是生活随笔為你收集整理的qt 判断字符串中是否含有中文字符_Qt 中文字符串问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 mailto URI 发送邮件
- 下一篇: 魔兽操作技巧