• 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)

  • 相关阅读:
    挑战程序设计竞赛 第2章习题 poj 1017 Packets 贪心模拟
    挑战程序设计竞赛 2章习题 poj 2376 Cleaning Shifts
    Leetcode 27. 移除元素 双指针
    Leetcode 26. 删除有序数组中的重复项 双指针
    Leetcode 31. 下一个排列
    webserver 发布问题
    [转]机器学习中的各种距离
    VUE3 + TYPESCRIPT 开发实践总结
    我和ABP vNext 的故事
    ABP Framework 为什么好上手,不好深入?探讨最佳学习姿势!
  • 原文地址:https://www.cnblogs.com/zhucl1006/p/1773433.html
Copyright © 2020-2023  润新知