日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT 中中文问题

發布時間:2024/3/24 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT 中中文问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

亂碼問題

QT程式中當出現中文時,經常會出現亂碼

網上也有好多解決方法:例如:

在main中加入QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")) 等

?

我這邊在xp的環境進行測試,加入后,可以正確的顯示中文,但是換到windows7上,再執行,就有變成亂碼了。 也不知道為何原因。

?

之后嘗試多種方法均失敗。包括更改源文件的編碼方式,使用QTextCodec::setCodecForLocale(QTextCodec::codecForLocale( ))等…

沒有辦法了,只有使用qm文件了,反正程式支援多語言也是一個程式的基本的功能.而且要變更顯示時,只需要更改qm文件就好。

于是,開始使用qm文件。程式加載時先加載QM文件后,顯示正常

qm文件產生過程:

1.lupdate ,將應用程式的tr中的字符全部提取出來,(.h和.cpp的源碼文件的編碼方式要相同,否則不會提取該Class的tr內容。之前嘗試時,有把cpp的文件編碼更改為unicode,結果導致lupdate就是找不到該類的tr)

2.使用QT Linguist 翻譯。如果源碼中有中文,可能會出現亂碼,建議源碼中使用英文進行編寫,在使用Linguist進行翻譯。

3.使用lrelease生成qm文件。

4.main中加載,代碼如下

??? QTranslator appTranslator;
??? appTranslator.load("transferFile_zh.qm",QApplication::applicationDirPath());
??? a.installTranslator(&appTranslator);

我直接放到了程式所在的目錄了,所以直接讀取applicationDirPath,如果你要放到其他位置,就需要再更改該Dir了。

?

以上在源碼中直接使用中文亂碼的問題算是解決了。

?

QTextStream格式帶中文對齊輸出問題

因為在做一個文件轉檔時,會涉及到文件中帶有中文,在使用QTextStream進行格式化輸出時,使用setFieldWidth來設置Field的寬度,結果發現一個漢字的長度被計算成1。因為補齊字符為空格,所以導致如果出現漢字,就變得不會對其了。

例如:setFieldWidth(10)

??????? 你好??????? 99

????? 你還好嗎??????? 00

?

在第一行中,到你好之前是8個空格+“你好” ,長度是10碼。

第二行中,到你還好嗎之前是6個空格+“你還好嗎”,長度是10碼,

但是問題來了,漢字其實是占用兩個字節的,而空格是占用一個字節的,所以導致并沒有對齊。

?

目前我的解決方法為:

取出一個QString時,遍歷所有的QChar,因為QChar是Unicode的編碼,所以QChar可以保存所有的Unicode的編碼。

在取出時,判斷一下是否Ascii碼,如果不是,設置的長度-1.如果只是要判斷是否中文,可以判斷QChar的unicode是否在 中文范圍 4E00-9FBF 之內。

code:

????? out.setFieldAlignment(QTextStream::AlignRight);
???????????? QString temp;
??????? foreach(QString Lineitem ,LineArr)
??????? {
??????????? int fieldwidth? = 15;

??????????? foreach(QChar charitem,Lineitem)
??????????? {
??????????????? if (charitem.unicode()>0x7F)
??????????????? {
??????????????????? fieldwidth --;
??????????????? }
??????????? }
????????? out << qSetFieldWidth(fieldwidth) << Lineitem;
??????? }
??????? out << endl;

?

以上輸出結果:

????? 你好??????? 99

你還好嗎??????? 00

可以看到已經對齊了。

?

附錄:Unicode 編碼范圍

  注:中文范圍 4E00-9FBF:CJK 統一表意符號 (CJK Unified Ideographs)

  0000-007F:C0控制符及基本拉丁文 (C0 Control and Basic Latin)

  0080-00FF:C1控制符及拉丁文補充-1 (C1 Control and Latin 1 Supplement)

  0100-017F:拉丁文擴展-A (Latin Extended-A)

  0180-024F:拉丁文擴展-B (Latin Extended-B)

  0250-02AF:國際音標擴展 (IPA Extensions)

  02B0-02FF:空白修飾字母 (Spacing Modifiers)

  0300-036F:結合用讀音符號 (Combining Diacritics Marks)

  0370-03FF:希臘文及科普特文 (Greek and Coptic)

  0400-04FF:西里爾字母 (Cyrillic)

  0500-052F:西里爾字母補充 (Cyrillic Supplement)

  0530-058F:亞美尼亞語 (Armenian)

  0590-05FF:希伯來文 (Hebrew)

  0600-06FF:阿拉伯文 (Arabic)

  0700-074F:敘利亞文 (Syriac)

  0750-077F:阿拉伯文補充 (Arabic Supplement)

  0780-07BF:馬爾代夫語 (Thaana)

  07C0-077F:西非書面語言 (N'Ko)

  0800-085F:阿維斯塔語及巴列維語 (Avestan and Pahlavi)

  0860-087F:Mandaic

  0880-08AF:撒馬利亞語 (Samaritan)

  0900-097F:天城文書 (Devanagari)

  0980-09FF:孟加拉語 (Bengali)

  0A00-0A7F:錫克教文 (Gurmukhi)

  0A80-0AFF:古吉拉特文 (Gujarati)

  0B00-0B7F:奧里亞文 (Oriya)

  0B80-0BFF:泰米爾文 (Tamil)

  0C00-0C7F:泰盧固文 (Telugu)

  0C80-0CFF:卡納達文 (Kannada)

  0D00-0D7F:德拉維族語 (Malayalam)

  0D80-0DFF:僧伽羅語 (Sinhala)

  0E00-0E7F:泰文 (Thai)

  0E80-0EFF:老撾文 (Lao)

  0F00-0FFF:藏文 (Tibetan)

  1000-109F:緬甸語 (Myanmar)

  10A0-10FF:格魯吉亞語 (Georgian)

  1100-11FF:朝鮮文 (Hangul Jamo)

  1200-137F:埃塞俄比亞語 (Ethiopic)

  1380-139F:埃塞俄比亞語補充 (Ethiopic Supplement)

  13A0-13FF:切羅基語 (Cherokee)

  1400-167F:統一加拿大土著語音節 (Unified Canadian Aboriginal Syllabics)

  1680-169F:歐甘字母 (Ogham)

  16A0-16FF:如尼文 (Runic)

  1700-171F:塔加拉語 (Tagalog)

  1720-173F:Hanunóo

  1740-175F:Buhid

  1760-177F:Tagbanwa

  1780-17FF:高棉語 (Khmer)

  1800-18AF:蒙古文 (Mongolian)

  18B0-18FF:Cham

  1900-194F:Limbu

  1950-197F:德宏泰語 (Tai Le)

  1980-19DF:新傣仂語 (New Tai Lue)

  19E0-19FF:高棉語記號 (Kmer Symbols)

  1A00-1A1F:Buginese

  1A20-1A5F:Batak

  1A80-1AEF:Lanna

  1B00-1B7F:巴厘語 (Balinese)

  1B80-1BB0:巽他語 (Sundanese)

  1BC0-1BFF:Pahawh Hmong

  1C00-1C4F:雷布查語(Lepcha)

  1C50-1C7F:Ol Chiki

  1C80-1CDF:曼尼普爾語 (Meithei/Manipuri)

  1D00-1D7F:語音學擴展 (Phonetic Extensions)

  1D80-1DBF:語音學擴展補充 (Phonetic Extensions Supplement)

  1DC0-1DFF:結合用讀音符號補充 (Combining Diacritics Marks Supplement)

  1E00-1EFF:拉丁文擴充附加 (Latin Extended Additional)

  1F00-1FFF:希臘語擴充 (Greek Extended)

  2000-206F:常用標點 (General Punctuation)

  2070-209F:上標及下標 (Superscripts and Subscripts)

  20A0-20CF:貨幣符號 (Currency Symbols)

  20D0-20FF:組合用記號 (Combining Diacritics Marks for Symbols)

  2100-214F:字母式符號 (Letterlike Symbols)

  2150-218F:數字形式 (Number Form)

  2190-21FF:箭頭 (Arrows)

  2200-22FF:數學運算符 (Mathematical Operator)

  2300-23FF:雜項工業符號 (Miscellaneous Technical)

  2400-243F:控制圖片 (Control Pictures)

  2440-245F:光學識別符 (Optical Character Recognition)

  2460-24FF:封閉式字母數字 (Enclosed Alphanumerics)

  2500-257F:制表符 (Box Drawing)

  2580-259F:方塊元素 (Block Element)

  25A0-25FF:幾何圖形 (Geometric Shapes)

  2600-26FF:雜項符號 (Miscellaneous Symbols)

  2700-27BF:印刷符號 (Dingbats)

  27C0-27EF:雜項數學符號-A (Miscellaneous Mathematical Symbols-A)

  27F0-27FF:追加箭頭-A (Supplemental Arrows-A)

  2800-28FF:盲文點字模型 (Braille Patterns)

  2900-297F:追加箭頭-B (Supplemental Arrows-B)

  2980-29FF:雜項數學符號-B (Miscellaneous Mathematical Symbols-B)

  2A00-2AFF:追加數學運算符 (Supplemental Mathematical Operator)

  2B00-2BFF:雜項符號和箭頭 (Miscellaneous Symbols and Arrows)

  2C00-2C5F:格拉哥里字母 (Glagolitic)

  2C60-2C7F:拉丁文擴展-C (Latin Extended-C)

  2C80-2CFF:古埃及語 (Coptic)

  2D00-2D2F:格魯吉亞語補充 (Georgian Supplement)

  2D30-2D7F:提非納文 (Tifinagh)

  2D80-2DDF:埃塞俄比亞語擴展 (Ethiopic Extended)

  2E00-2E7F:追加標點 (Supplemental Punctuation)

  2E80-2EFF:CJK 部首補充 (CJK Radicals Supplement)

  2F00-2FDF:康熙字典部首 (Kangxi Radicals)

  2FF0-2FFF:表意文字描述符 (Ideographic Description Characters)

  3000-303F:CJK 符號和標點 (CJK Symbols and Punctuation)

  3040-309F:日文平假名 (Hiragana)

  30A0-30FF:日文片假名 (Katakana)

  3100-312F:注音字母 (Bopomofo)

  3130-318F:朝鮮文兼容字母 (Hangul Compatibility Jamo)

  3190-319F:象形字注釋標志 (Kanbun)

  31A0-31BF:注音字母擴展 (Bopomofo Extended)

  31C0-31EF:CJK 筆畫 (CJK Strokes)

  31F0-31FF:日文片假名語音擴展 (Katakana Phonetic Extensions)

  3200-32FF:封閉式 CJK 文字和月份 (Enclosed CJK Letters and Months)

  3300-33FF:CJK 兼容 (CJK Compatibility)

  3400-4DBF:CJK 統一表意符號擴展 A (CJK Unified Ideographs Extension A)

  4DC0-4DFF:易經六十四卦符號 (Yijing Hexagrams Symbols)

  4E00-9FBF:CJK 統一表意符號 (CJK Unified Ideographs)

  A000-A48F:彝文音節 (Yi Syllables)

  A490-A4CF:彝文字根 (Yi Radicals)

  A500-A61F:Vai

  A660-A6FF:統一加拿大土著語音節補充 (Unified Canadian Aboriginal Syllabics Supplement)

  A700-A71F:聲調修飾字母 (Modifier Tone Letters)

  A720-A7FF:拉丁文擴展-D (Latin Extended-D)

  A800-A82F:Syloti Nagri

  A840-A87F:八思巴字 (Phags-pa)

  A880-A8DF:Saurashtra

  A900-A97F:爪哇語 (Javanese)

  A980-A9DF:Chakma

  AA00-AA3F:Varang Kshiti

  AA40-AA6F:Sorang Sompeng

  AA80-AADF:Newari

  AB00-AB5F:越南傣語 (Vi?t Thái)

  AB80-ABA0:Kayah Li

  AC00-D7AF:朝鮮文音節 (Hangul Syllables)

  D800-DBFF:High-half zone of UTF-16

  DC00-DFFF:Low-half zone of UTF-16

  E000-F8FF:自行使用區域 (Private Use Zone)

  F900-FAFF:CJK 兼容象形文字 (CJK Compatibility Ideographs)

  FB00-FB4F:字母表達形式 (Alphabetic Presentation Form)

  FB50-FDFF:阿拉伯表達形式A (Arabic Presentation Form-A)

  FE00-FE0F:變量選擇符 (Variation Selector)

  FE10-FE1F:豎排形式 (Vertical Forms)

  FE20-FE2F:組合用半符號 (Combining Half Marks)

  FE30-FE4F:CJK 兼容形式 (CJK Compatibility Forms)

  FE50-FE6F:小型變體形式 (Small Form Variants)

  FE70-FEFF:阿拉伯表達形式B (Arabic Presentation Form-B)

  FF00-FFEF:半型及全型形式 (Halfwidth and Fullwidth Form)

  FFF0-FFFF:特殊 (Specials)


http://www.cnblogs.com/zhucl1006/archive/2010/07/08/1773433.html


總結

以上是生活随笔為你收集整理的QT 中中文问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。