查看完整版本: [-- 从QFileDialog 中返回的QString,用fopen打开中文名文件有问题! --]

QTCN开发网 -> Qt中文处理 -> 从QFileDialog 中返回的QString,用fopen打开中文名文件有问题! [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

yongjie 2014-12-12 15:41

从QFileDialog 中返回的QString,用fopen打开中文名文件有问题!

在Windows 7上,用Qt5.3.1/MinGW环境。

QString
fileName = QFileDialog::getOpenFileName(this, tr("加载文件"), "", ...);
FILE * fp = fopen(fileName.toStdString().c_str(), "r");

如果选中的文件是中文名,则有问题。这里需要转换吗?

在main()中设了:

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));

tr()之类的功能都很正常。

这里缺了哪个步骤吗?哪位高手指点一下。谢谢!

dbzhang800 2014-12-12 16:07
错误一:不该用QTextCodec::setCodecForLocale() ,请直接去掉它

错误二:不该用 fileName.toStdString().c_str()。请直接用 QString::toLocal8Bit().data() 或 gbk/gb232对应的 QTextCodec 来显式转换。


realfan 2014-12-12 16:17
用QFile不是更好嘛,直接用QString作参数。何苦给自己找麻烦

yongjie 2014-12-13 09:16
谢谢二位指正。将QTextCodec::setCodecForLocale()去掉果然好了。不过,我还是改用QFile了。


记得QT4时,在main()中要加这个setCodecForLocale(应该还有其它二个调用,但5.0不支持了)。现在都不需要了?

用如下语句:

QTextCodec::setCodecForLocale(“GB8030”);

好象也可以。

dbzhang800 2014-12-13 22:05
yongjie:谢谢二位指正。将QTextCodec::setCodecForLocale()去掉果然好了。不过,我还是改用QFile了。
记得QT4时,在main()中要加这个setCodecForLocale(应该还有其它二个调用,但5.0不支持了)。现在都不需要了?
....... (2014-12-13 09:16) 

Qt4下这么干也是错的。

网络上,涉及到setCodecForXXX 的中文用法, 99%以上都是错误的或不恰当的用法。

dbzhang800 2014-12-13 22:15
yongjie:谢谢二位指正。将QTextCodec::setCodecForLocale()去掉果然好了。不过,我还是改用QFile了。
记得QT4时,在main()中要加这个setCodecForLocale(应该还有其它二个调用,但5.0不支持了)。现在都不需要了?
....... (2014-12-13 09:16) 

加这句对你可能是没问题,但你要明白:加之前,你的程序可以在多个平台(Linux/MacX/其他语言的Windows)下运行了;加之后,只能在简体中文Windows运行。

yongjie 2014-12-14 09:40
dbzhang800:加这句对你可能是没问题,但你要明白:加之前,你的程序可以在多个平台(Linux/MacX/其他语言的Windows)下运行了;加之后,只能在简体中文Windows运行。 (2014-12-13 22:15) 

明白了。以后就不用这个setCodecFor... 调用了。

实际上,就是QTranslator.load是必要的了,翻译tr()中的字串。

在我的机器上,UTF8和GB18030互相转换多了,好象有问题。我又退回File,不用QFile了。这样,根据一个布尔量,决定是用Local8还是UTF8

    QString fileName = QFileDialog::getOpenFileName(this, tr("加载文件"), "",
                                                    tr("Script File (*.scs *.txt)"));
    if (fileName.size() == 0)
        return;
    FILE * fp = fopen(fileName.toLocal8Bit().data(), "r");
    if (fp == NULL) {
        return;
    } else {
        char buf[1024];
        while(fgets(buf, 1023, fp) != NULL) {
            QString line;
            int len = strlen(buf);
            if (buf[len - 1] == '\n')
                buf[len - 1] = '\0';
            if (local8Flag) {
                line = QString::fromLocal8Bit(buf);
            } else
                line = QString::fromUtf8(buf);
            edit->appendPlainText(line);
        }
        fclose(fp);
    }

工作的还可以。谢谢二位!


查看完整版本: [-- 从QFileDialog 中返回的QString,用fopen打开中文名文件有问题! --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled