亂碼問題
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