• 26259阅读
  • 7回复

[提问]qt 打开文件时,中文路径名问题 [复制链接]

上一主题 下一主题
离线songpeng
 
只看楼主 倒序阅读 楼主  发表于: 2009-09-08
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
请问兄台们!
我用 QFileDialog::getOpenFileName()获取到的文件路径名!
如果是英文我放到QString file_name;里面打印出来是没有问题的;
如果包含中文字符时QString file_name;里面打印出来中午字符就是 乱码 或者“??”;

主要的的问题是 我想得到正确(包含中文字符)的QString file_name;而为了代码后面用到file_name转换成c++的string;
我也用了一些处理字符的函数但是还是没有搞定!搞了下午还是不行!
std::string str = QString().toUtf8().data();。。。。。。。


请高手们帮帮忙!给点具体方法!


先谢谢了!!!!
认真的做我自己的事情!
离线dbzhang800

只看该作者 1楼 发表于: 2009-09-08
引用楼主songpeng于2009-09-08 18:38发表的 qt 打开文件时,中文路径名问题 :
请问兄台们!
我用 QFileDialog::getOpenFileName()获取到的文件路径名!
如果是英文我放到QString file_name;里面打印出来是没有问题的;
如果包含中文字符时QString file_name;里面打印出来中午字符就是 乱码 或者“??”;
.......


你能介绍一下你是怎么打印的么??你打印到什么上面了?你这个东西本身又是支持的什么编码??


引用楼主songpeng于2009-09-08 18:38发表的 qt 打开文件时,中文路径名问题 :
主要的的问题是 我想得到正确(包含中文字符)的QString file_name;而为了代码后面用到file_name转换成c++的string;
我也用了一些处理字符的函数但是还是没有搞定!搞了下午还是不行!
std::string str = QString().toUtf8().data();。。。。。。。

.......

为什么要转换到c++ 的不支持unicode的std::string呢? 不能用c++中的std::wstring吗?

如果你非要用std::string,那么你至少要了解你需要的字符编码吧? QString本身是unicode,你或许需要转换到utf-8或gbk
离线songpeng
只看该作者 2楼 发表于: 2009-09-09
dbzhang800 谢谢你的回答!
原本是这样的:   (我用的是windows下的《QT creator》编译的)
    用QFileDialog::getOpenFileName()获取到的文件路径名
    如果打开包含中文字符的路径,赋值给QString file_name(应是Unicode的)
    然后我用qt的debug()函数打印在《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++)来打开文件!
    我之前没有理会他有没有乱码,我直接转换成sting,结果肯定是打不开文件了啊!
    {我就是在pc机上写windows平台啊,也不太清楚要那种格式,还有你说的wstring没有怎么用过}
    原本就这样了谢谢兄台给点指示!小弟感谢了~
认真的做我自己的事情!
离线songpeng
只看该作者 3楼 发表于: 2010-08-12

    QString name = QFileDialog::getOpenFileName( ); //得到路径名
    再用一个QLineEdit上显示出来 就行了!打印也没有问题!
    搞不懂以前 是怎么回事!
认真的做我自己的事情!
离线aisq2008

只看该作者 4楼 发表于: 2010-08-25
哪位高人来把这个问题结了吧,达人呢,视乎没有有真本事的人了
离线linlin3233
只看该作者 5楼 发表于: 2010-08-27
研究了一下其实还是编码转换的问题.
我的是windowsXP 系统.

添加下面语句.

QTextCodec* codec =QTextCodec::codecForName("gbk"); // gbk 换成 GB2312 也可以

//该函数用在用字符常量或者QByteArray构造QString对象时使用的默认编码方式。
QTextCodec::setCodecForCStrings(codec);

//用于设置和对本地文件系统读写时候的默认编码格式。比如通过流读取一个文件时内容时的编码格式。或者通过qDebug()输出打印信息时的编码。
QTextCodec::setCodecForLocale(codec);

如果你用到 tr("中文字符串");的语句给QString赋值的话
还需要添加这条语句 : QTextCodec::setCodecForTr(codec); //这个函数的作用是设置传给tr函数时的默认字串编码


file_name = QFileDialog::getOpenFileName();
把file_name转换成 C++的string然后用 qDebug(const char*,...)的形式输出依然还是乱码.
但是用 qDebug() << file_name.toStdString().data() 或者 qDebug() << file_name 都可以正常显示.

不过,我没用测试过 使用 file_name.toStdString().data() 得到的字符串是否可以打开文件.
但是用QString(file_name.toStdString().data() );构造的QString 还是可以在LineEdit中显示出中文的.
离线linlin3233
只看该作者 6楼 发表于: 2010-08-27
更正一下上文的结论:
    QTextCodec* codec =QTextCodec::codecForName("utf8");
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForLocale(codec);
    QString fileName = QFileDialog::getOpenFileName();
    if (!fileName.isEmpty())
    {

        const char*p = fileName.toStdString().data();
        qDebug("%s", p) ;
        QString temp = tr(p);
        ui->lineEdit->setText(temp);
    }

这样写显示和打印都正常, 如果使用"GB2312"的话, qDebug还是会输出乱码, 不过使用qDebug() << p ; 的形式输出没问题.
离线yfx2003

只看该作者 7楼 发表于: 2010-08-28
还是字符编码的问题

注意输出的内容和编码的关系,理清头绪,不是什么问题
www.qtcn.org/gpq4/
ajaxref.okajax.com/
快速回复
限100 字节
 
上一个 下一个