• 18584阅读
  • 11回复

[提问]关于QString对中文的支持问题 [复制链接]

上一主题 下一主题
离线cwbcwb505
 
只看楼主 倒序阅读 楼主  发表于: 2008-10-29
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
很奇怪,我在一个工程里面是这样用QString的:
QString Qstr = "D:\\你好吗?\\klfjsdl.jpg";
    std::string STDstr;
    STDstr = Qstr.toAscii();
但是我在调跟踪的时候,发现Qstr里面是乱码!而STDstr里面却是正确的值!
而在另一个工程里面我是这样用QString的:
QString Qstr = QDirIterator.next();当 QDirIterator反回的是一个带有中文的文件夹时,QStr里面的值正常,而当我用
std::string STDstr = QStr.toStdString()或是std::string STDstr = Qstr.toAscii()时,发现STDstr里面的中文字段是乱码!我还用过Qstr.toUtf8();返回的结果也是乱码,

主要的的问题是第如何将一个带有中文的Qstring转换成正确的std::string呢?



                                            谢谢!!!!
离线guanxu

只看该作者 1楼 发表于: 2008-10-29
程序中尽量不要用中文,包括所用的 文件夹,文件。。。。

不只是 Qt 就算是系统。中文的路径名,文件名也一直是个问题。
我现在的电脑上全是英文名(以前的 linux 中文文件夹是乱码,所以用着用着习惯了)
英文只有 26 个字母,算上大小写,各种常用符号,也不过 一百多个。
中文字可多了去了。

毕竟编程用的语言就是英文表示的,遵守一定的规范对谁都方便。
离线cwbcwb505
只看该作者 2楼 发表于: 2008-10-30
因为操作系统是中文操作系统,程序中可以保证不用中文,可是文件目录是不可能避免用中文,主要是我们做的程序不是自己用,而是要让别人用,我们总不能卖东西的时候叫人家不要用中文文件夹吧
离线water_wf

只看该作者 3楼 发表于: 2008-10-30
常用的处理字符相关的函数:
QString str = QString::fromUtf8("xxx");
QByteArray  = str.toUtf8();
QByteArray = str.toLatin1();
std::string str = QString().toUtf8().data();
这个自己试下就会了
离线mumutouv

只看该作者 4楼 发表于: 2008-10-30
QString Qstr = QString::fromUtf8("D:\\你好吗?\\klfjsdl.jpg");
或者
QString Qstr = QString::fromUnicode("D:\\你好吗?\\klfjsdl.jpg");
离线cwbcwb505
只看该作者 5楼 发表于: 2008-10-31
        楼上那位兄弟回答得很好,本人又有了一些新启发,不过有一个问题是我那个QString是从
QFileDialog::getExistingDirectory()得来的,所以我不能控制它得来的方式,像楼上所说的用toUtf8我也用过,当时调试的时候也是错误的!不过我仔细的揣摩了一下,发现原来QT有一个专门用于编码之间的转换的类——QTextCodec,然后我们的中文编码又是——gb18030,而QT对字符串的处理与储存都是用的Unicode,具体代码如下:
QTextCodec *code;
QString          strImage;
std::string      strbuffer;
strImage = QFileDialog::getExistingDirectory(this, "Select image path");
code = QTextCodec::codecForName("gb18030");
strBuffer = code->fromUnicode(strImage).data();

这样我的strBuffer里面就得到了正确的中文文件目录,但是我还是有搞不懂的地方就是QString是用的unicode,而std::string也是支持Uncode的,那为什么他们之间不能直接传值呢?而是要通过转换的,搞不懂
离线charlesjun
只看该作者 6楼 发表于: 2009-06-23
我用4楼的方法搞定了哦,不过还是不懂,高手能分析下么?
离线songpeng
只看该作者 7楼 发表于: 2009-09-09
charlesjun你好!
   看见你们的帖子我很感激!
      但是我还在没有能解决!希望分享下成功方法
     (我用的是windows下的《QT creator》编译的)
     用QFileDialog::getOpenFileName()获取到的文件路径名
     如果打开包含中文字符的路径,赋值给QString file_name(应是Unicode的)
     然后我用qt的qDebug()函数打印在《QT creator》的输出栏看到时中文字符就是乱码
    《QT creator》输出栏的打印:    Starting D:/stemperature_table2_0/debug/stemperature_table2_0.exe...
                                                                   llllllsongpengssssssss11 "C:/Documents and Settings/admin/×ÀÃæ/0000B.000"
          我想得到正确路径然后再转换成c++的string;目的是为了,我后面代码用他来再次(用c++)来打开文件!
     我也试过楼上的那些方法好像没有行!
     希望提示下 等待佳音。。。。。。。。。。。。
认真的做我自己的事情!
离线dinotiger510
只看该作者 8楼 发表于: 2009-12-03
在windows下,QString转char*,使用toLocal8Bit().data()就能获得,当然前提你要是QString中是正确的中文,即

str="我是中国人";
qDebug()<<str;   //能输出"我是中国人"。

如果是在linux下,就跟系统有关系了。有区别的,而且如果是qt4,linux下中文还需要翻译器。

QString的中文变量声明也是有区别的。

linux下TextCodec是GBK的,而windows下是GB18030的。所以你可以在main.cpp中定义

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

或是
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB18030"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));

然后在使用QString中文是,采用QString::fromLocal8Bit("我是中国人").或tr("我是中国人")来进行变量声明。这样才能正确显示在窗体控件上,而不是乱码。
离线haulm

只看该作者 9楼 发表于: 2009-12-03
引用第1楼guanxu于2008-10-29 20:02发表的  :
程序中尽量不要用中文,包括所用的 文件夹,文件。。。。
不只是 Qt 就算是系统。中文的路径名,文件名也一直是个问题。
我现在的电脑上全是英文名(以前的 linux 中文文件夹是乱码,所以用着用着习惯了)
英文只有 26 个字母,算上大小写,各种常用符号,也不过 一百多个。
.......


标准答案就是不要在程序代码中使用中文,标准的做法是把菜单关键字或摘要用tr()函数包装,然后在main()中加载翻译文件。
为什么不用中文,试下就知道了,当在程序代码中使用了中文,你就无法国际化了,因为导出要翻译的文本不是中文而是一堆代表符号。
离线haulm

只看该作者 10楼 发表于: 2009-12-03
QString::fromLocal8Bit的用途最小或说在实际编程中是没有用的,tr()用途最广。
离线wd007

只看该作者 11楼 发表于: 2009-12-05
使用tr()是很稳妥的一种方式,这也是Qt 官方所极力推荐的。

当然这几种方法都可以,我个人倾向于代码中不使用中文符号,使用tr(),然后进行国际化。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
快速回复
限100 字节
 
上一个 下一个