• 8036阅读
  • 13回复

QFiledialog  使用 DontUseNativeDialog, 中文乱码 [复制链接]

上一主题 下一主题
离线cyberpunker
 

只看楼主 倒序阅读 楼主  发表于: 2014-12-03

在 CentOS 系统上,修改系统编码为 GB2312,

QFiledialog  使用 DontUseNativeDialog时, 对话框中的中文乱码, 不使用 DontUseNativeDialog,对话框中的中文正常。

即使在main中使用了如下代码:
         QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));  
        QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));  
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));  

效果还是一样的。

是不是QT内建是 Unicode, 不支持 GB2312的原因 ?

如果让程序能够 ”任意系统编码环境“ 下正常使用,怎么解决呢?



  


  
离线dbzhang800

只看该作者 1楼 发表于: 2014-12-03
先搞清楚那三个 setCodecForXXX 分别是干什么的再说吧。

建议:直接看Manual,不要看网上搜到的结果(网上99%以上关于这几个的用法都是错误的)。
离线cyberpunker

只看该作者 2楼 发表于: 2014-12-03
回 dbzhang800 的帖子
dbzhang800:先搞清楚那三个 setCodecForXXX 分别是干什么的再说吧。
建议:直接看Manual,不要看网上搜到的结果(网上99%以上关于这几个的用法都是错误的)。 (2014-12-03 20:39)


请指教一下,今天调了一天了,

把系统语言改成中文后,Cmake还不能编译,只能换成英文,编译后,再换成中文实验,折腾起来非常麻烦

使用 codecForLocale() 得到 codec->name()输出后,都是System是何解? 不应该输出当前系统编码的名称吗?



离线cyberpunker

只看该作者 3楼 发表于: 2014-12-03
回 dbzhang800 的帖子
dbzhang800:先搞清楚那三个 setCodecForXXX 分别是干什么的再说吧。
建议:直接看Manual,不要看网上搜到的结果(网上99%以上关于这几个的用法都是错误的)。 (2014-12-03 20:39) 


这个问题是实际上应该是:

文件系统的文件名的字符编码 --------------> QT 本身要显示中文的问题。

因为使用了DontUseNativeDialog 的对话框,对话框全部是QT自身实现的,那么QT自身是不是有能力显示中文, 一个是编码相关,第二个不是不是跟有没有中文字体相关?

我的代码中实际上没有任何地方要在GUI上直接的显示中文,包括按钮名称等使用中文硬编码。

离线dbzhang800

只看该作者 4楼 发表于: 2014-12-04
1. 删掉三行代码 有什么效果?

2. 你提到:修改系统编码为 GB2312,为什么要这么改呢?
离线cyberpunker

只看该作者 5楼 发表于: 2014-12-04
回 dbzhang800 的帖子
dbzhang800:1. 删掉三行代码 有什么效果?
2. 你提到:修改系统编码为 GB2312,为什么要这么改呢? (2014-12-04 10:50) 


一样的,还是乱码,加这几行代码就是为了想解决乱码的问题。

为了想测试不同环境下,是否能正常运行。

离线dbzhang800

只看该作者 6楼 发表于: 2014-12-04
1. 首先,去掉那三行代码。

2. 其次,告诉大家你代码中具体是怎么做的,乱码是什么样子的(哪怕是一个截图也好)。
离线cyberpunker

只看该作者 7楼 发表于: 2014-12-04
回 dbzhang800 的帖子
dbzhang800:1. 首先,去掉那三行代码。
2. 其次,告诉大家你代码中具体是怎么做的,乱码是什么样子的(哪怕是一个截图也好)。 (2014-12-04 13:19)



首先,我的问题不是代码本身有中文的问题,我的代码中不涉及任何非英文字符。
其次,代码中没有做任何跟编码相关的设置,包括那三行。
第三,乱码把系统编码设置为”非UTF-8“出现的。使用 QFiledialog 的DontUseNativeDialog方式去浏览文件系统, 查看中文文件名为乱码。


其实就是一个普通的QT程序,应该完全可以使用QT里的例子来实验,但是Centos yum下载 qt-demos,其中没有使用 QFiledialog浏览文件的例子。或许可以在Ubuntu上试试。

我猜想是这样的: 我是在系统在UTF-8 的时候修改的中文名,文件系统也是以UTF-8 来存储文件名的,当把系统改成 GB2312后,glib会使用GB2312来呈现文件名,所以会出现乱码,——在shell里也会出现乱码的现象可以佐证——QT的DontUseNativeDialog 的GUI  和shell一样,都是基于glib的,所以都是乱码。

但是,GNOME桌面可能更加的智能,它native的会记录或者识别文件名的编码(我改名就是在桌面里弄的,没准它暗中记录了文件名编码),也或者,单单修改locale文件,并不完全的改变了系统的编码环境。

---------------------------------------------------------

我阅读了


[建议]QtC++源码中使用中文所需了解的细节 [复制链接]



[提问]关于Qt4程序支持中文方法的总结[复制链接]


谢谢你们的总结
离线dbzhang800

只看该作者 8楼 发表于: 2014-12-04
如果你所说属实,那么
1. 这是一个 Qt 的BUG
2. 你应该可以提供一个简单的完整的可直接编译运行的程序来重现问题。(整个完整的测试程序不会超过20行代码)
离线cyberpunker

只看该作者 9楼 发表于: 2014-12-05
回 dbzhang800 的帖子
dbzhang800:如果你所说属实,那么
1. 这是一个 Qt 的BUG
2. 你应该可以提供一个简单的完整的可直接编译运行的程序来重现问题。(整个完整的测试程序不会超过20行代码) (2014-12-04 15:31) 



我用QT的 Findfile 例子,重复了我的描述,问题复现了,


离线dbzhang800

只看该作者 10楼 发表于: 2014-12-05
回 cyberpunker 的帖子
cyberpunker:我用QT的 Findfile 例子,重复了我的描述,问题复现了,
....... (2014-12-05 10:26) 

这样的话,你可以可以去提交BUG了。

另外,你可以试试在Qt5下能否重现。如果能重现,BUG比较被官方重视。
离线cyberpunker

只看该作者 11楼 发表于: 2014-12-05
回 dbzhang800 的帖子
dbzhang800:这样的话,你可以可以去提交BUG了。
另外,你可以试试在Qt5下能否重现。如果能重现,BUG比较被官方重视。 (2014-12-05 11:15) 



这种问题应该轮不到我去提bug吧, 也许还是哪里我还没弄对,


离线dbzhang800

只看该作者 12楼 发表于: 2014-12-05
呵呵,

1. 如果用户不提BUG,那么还能有谁去提BUG呢 ?
2. 如果你能用很简单的程序重现问题,那就是BUG。
离线cyberpunker

只看该作者 13楼 发表于: 2014-12-05
回 dbzhang800 的帖子
dbzhang800:呵呵,
1. 如果用户不提BUG,那么还能有谁去提BUG呢 ?
2. 如果你能用很简单的程序重现问题,那就是BUG。 (2014-12-05 12:24) 



https://bugreports.qt-project.org/browse/QTBUG-43134
快速回复
限100 字节
 
上一个 下一个