Qt5乱码问题



  • 今天下午我的Qt工程不知怎的,所有中文突然乱码,怎么改编码都没有效果。新建工程也无效。
    后来我找到了这个宏 QStringLiteral("心好累.");
    宏定义为

    #  define QStringLiteral(str) \
        ([]() -> QString { \
            enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
            static const QStaticStringData<Size> qstring_literal = { \
                Q_STATIC_STRING_DATA_HEADER_INITIALIZER(Size), \
                QT_UNICODE_LITERAL(str) }; \
            QStringDataPtr holder = { qstring_literal.data_ptr() }; \
            const QString qstring_literal_temp(holder); \
            return qstring_literal_temp; \
        }()) \
        /**/
    
    

    虽然这个可以解决,但是工程中有大量中文(勿喷),改起来比较麻烦,不知道有没有什么好的解决办法



  • @大黄老鼠 正则表达式捕获所有中文,并且使用正则表达式替换成相应的格式,这样可以做到么?



  • @大黄老鼠 推荐使用翻译家来处理,不然就使用这个了 QStringLiteral 宏了。在设计系统的时候推荐先做好中英文名词的映射。



  • @qyvlik 是的,我现在就是用的这个宏,今天累死我了,改了好久,
    怪Qt,不是我的错



  • @jiangcaiyang 还没试过,我Qt的正则表达式类没有Java的用得6



  • @大黄老鼠 那就没有好的办法了。其实正则表达式也不难做到。
    捕获两个半角引号,加上中间的若干汉字就行了。至少查找起来会方便一些。



  • @大黄老鼠 错的是世界,不是我。哈哈



  • @大黄老鼠Qt5乱码问题 中说:

    @qyvlik 是的,我现在就是用的这个宏,今天累死我了,改了好久,
    怪Qt,不是我的错

    怪你。
    正常来说代码里不应该有非ascii 文字。。。。



  • @Fsu0413 莫见怪,哈哈
    当时我还遇到更奇葩的事
    我在mingw中使用QStringLiteral
    它都不认
    原本是在vs2015中的


  • 网站研运

    @大黄老鼠 总而言之,最好不要在源码中写中文了。可以使用Qt语言家进行翻译。🖼



  • @大黄老鼠 Qt的正则表达式类QRegExp封装的是Perl的正则表达式语法。



  • ——Qt5中出现的中文乱码的问题甚是复杂。最开始使用Qt4.8.1在Ubuntu上做Linux嵌入式软件开发,当时还没有遇到中文乱码的问题,后来转到Windows7上做WinCE嵌入式软件开发,同一个工程再次编译起来痛苦不堪,各种中文乱码,改编码为utf8、gb2312都无效。后来逐渐明白,我在Ubuntu下使用的是GCC构建套件,交叉编译工具是arm_linux_gcc,GCC构建套件默认是使用utf8编码的,所以编译出来的程序使用的utf8编码,中文当然不会出现乱码。而在Windows7上使用的是vs2012版本的Qt4.8.1,而vs系列的VC++编译套件貌似使用是GBK编码。
    ——之后,发现在Windows下vs系列QtCreator中编写的源码要使用“utf8 无BOM”类型,而.pro工程又必须使用“utf8”类型(两者编码类型真的有区别),如此源码中的中文(包括硬编码中的中文、注释的中文)才不会出现乱码。
    ——前不久又见识过从Qt add in VS(大概是这么称呼吧,就是在VS中使用Qt开发)转到QtCreator中,仍然使用VS VC++构建套件的项目。其中使用了一个预编译指令来开启VC++启用utf8编码:

    #pragma once
    #execution_character_set("utf8")
    

    这种情况下,源码的编码就应该使用“utf8”而不是“uft8无BOM”或者“GBK”了。

    总结下,IDE中的编辑器有编码字符集、源码有编码字符集、编译器有编码字符集、运行环境也有编码字符集,这几者间如果搭配有问题,跑起来的应用遇到Unicode字符就乱码了,咋们见到中文乱码居多。



  • @crazyCpp 受教了,谢谢



  • @crazyCpp 各位描述的乱码问题都是100%可重现的。不知道有没有遇到过我这种奇葩的乱码问题:一开始运行起来一切都是正常的,当你进行了各种界面切换,会概率性出现乱码问题,这个时候打印16进制出来发现都是正常的utf8编码,可是显示出来的却是错位乱码的。怎么破?跪求指导!



  • @mnhdck 第一需要确认在运行的过程中有没有对出现乱码的那些中文字符串进行字符集编码的转换;第二仔细检查同一个包含了中文的字符串是否被修改过字符集编码而造成运行时乱码;第三中文字符串的来源是代码中的硬编码、还是从文件中读取而来、还是其他模块(.dll或.so)传递而来、或者是网络数据(网络数据流也有字符集编码区分);第四检查所有源文件保存时使用的编码字符集,除了.pro文件外一定要保持一致。

    如果不是以上情况,的确难以确定是什么原因引起的。



  • QT的中文乱码我也遇到过。
    我的全部文件均为utf-8编码,正常运行程序qDebug可以输出中文;但当我打断点调试时,qDebug的中文全部乱码,比较困扰,花了一些时间但最终没有搞定,不知道坛子里有人解决过类似问题没。



  • @flowerlove 调试的时候,估计Console的text编码格式不是utf-8的。这个也是我的推测。需要验证。



  • @jiangcaiyang 那目前调试支持哪些编码格式?





  • @flowerlove 好像是Latin1,因为所有的Utf-8的数据,要么变成\uXXX的格式,要么就变成???(这是代表编码损失)。


Log in to reply
 

走马观花

最近的回复

  • 这个错误没多大影响,qt模块可以在QT setting里进行勾选

    read more
  • 如果对操作不是很熟悉或者是操作不便的话,也可以在Windows的命令行执行NDK的安装。参数是一样的:
    Windows命令行安装NDK

    read more
  • 忘记补充图片了。这里需要点击更新安装才行。😆
    点击更新安装

    read more
  • 问:
    如何在Qt Creator安装NDK呢?
    除了那个🔽 按钮外,还有别的办法吗?
    答:
    Qt Creaator 4.11中更加整合了Android SDK Manager。其实大家都可以不运行默认的Android SDK Manager,直接在Qt Creator中选项->设备->Android,就可以进行操作了。

    通过````高级选项……,启动一些Android SDK Manager,只需要带上参数ndk-bundle```。原来没有NDK的你,也可以通过Android SDK Manager安装了。很简单吧。
    Android SDK Manager安装NDK

    read more

关注我们

微博
QQ群