设置了UTF8全局编码,如何读取一个文件名以GB2312编码的文件?

时间:2023-01-10 11:23:20
情况一:
代码在windows下编写,源码是以GB2312保存,最后在Linux下编译、运行

    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);  
QTextCodec::setCodecForCStrings(codec);  
QTextCodec::setCodecForTr(codec);
    std::string str = "中文文件名";  // 由于是以GB2312保存的源码,"中文文件名"是GB2312编码的,实际的文件名也是GB2312编码。
    QString strFileName = ??//这里该如何从 str转换
    if ( QFile::exists(strFileName) )
    {
        //do something
    }
 
经过下面多种测试都不行。。。
    QString strFileName = str.c_str();

    QString strFileName = QString::fromLocal8Bit(str.c_str());

    QTextCodec *codecUtf8 = QTextCodec::codecForName("UTF-8");
    QTextCodec *codecGB2312 = QTextCodec::codecForName("GB2312");
    QString strFileName = codecUtf8->fromUnicode(codecGB2312->toUnicode(str.c_str()));

情况二:同样的环境,源码也是GB2312,只有在QTextCodec设置成GB2312才能找到文件:
    QTextCodec *codec = QTextCodec::codecForName("GB2312"); //UTF-8改为GB2312
QTextCodec::setCodecForLocale(codec);  
QTextCodec::setCodecForCStrings(codec);  
QTextCodec::setCodecForTr(codec);

    std::string str = "中文文件名";
    QString strFileName = QString::fromLocal8Bit(str.c_str());
    if ( QFile::exists(strFileName) )  //找到了!
    {
        //do something
    }



在情况一下面,QTextCodec设置成UTF-8的条件下,如何从std::string转换为QString并找到文件(不能修改文件名编码)???

14 个解决方案

#1


设置成QTextCodec::setCodecForTr(QTextCodec::codecForName("gbk"));试试看

#2


楼上的,请看清楚内容在回答,别几个帖子只会用这一句回答!

十万火急!知道的请告知,谢谢

#3


QTextCodec::codecForName("GB2312")->toUnicode(str);

其中str就是你从gb2312文件中读取出来的数据,最好保持const char*形式传进去,toUnicode()函数返回的就是你想要的

#4


首先把strFileName存为QChar *

我实际案例中定义的是QChar *szStr;//自己去分配,这里不细说。
然后
    QString strTmp;

    strTmp = "";

    for ( int i = 0; i < 1024; i++)
    {
        if ( szStr[i] == QChar(0))
            break;
        else
            strTmp.append(szStr[i]);
    }

    return strTmp;

这时的strTmp就是你要的串。

#5


过滤下

#6


如果你的代码是以GB2312书写的,那么你应该在main函数做如下设置:

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));

#7


补充一下,如果你的程序在Linux下运行,那么你应该在main函数中做如下设置:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

你在情况一和情况二中,均使用相同的设置,一定是错误的。

#8


不太懂,顶一下。我写的程序只能放到英文路径下,并且提示信息全是英文的,挺苦恼。

#9


gbk与utf8互转的问题我也折腾了许久,我也是在Windows下写代码,然后到linux下交叉编译,运行在ARM目标板中。目前问题也解决,在我的贴子里6楼7楼,已把解决的方法写了出来,不过奇怪的是我发的这两个回复自己看不到,但在结贴管理里面有,然后想重新回复是又提示不能连续3次回复,CSDN真是蛋疼,不知你们碰过这种情况没?
http://topic.csdn.net/u/20111221/14/e2d75d46-6822-4a84-99f3-c3f462bd072c.html?22844

#10


引用 9 楼 weichaogui 的回复:
gbk与utf8互转的问题我也折腾了许久,我也是在Windows下写代码,然后到linux下交叉编译,运行在ARM目标板中。目前问题也解决,在我的贴子里6楼7楼,已把解决的方法写了出来,不过奇怪的是我发的这两个回复自己看不到,但在结贴管理里面有,然后想重新回复是又提示不能连续3次回复,CSDN真是蛋疼,不知你们碰过这种情况没?
http://topic.csdn.net/u/20111221/1……


既然Qt已经提供了那么强大的编码转换功能,就应该熟悉怎么用。处理过程中出现乱码,很大可能性是我们使用、设置的错误。我是不想再使用额外的库或者自己再去实现。

#11


引用 6 楼 xiachm 的回复:
如果你的代码是以GB2312书写的,那么你应该在main函数做如下设置:

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));

引用 7 楼 xiachm 的回复:
补充一下,如果你的程序在Linux下运行,那么你应该在main函数中做如下设置:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

你在情况一和情况二中,均使用相同的设置,一定是错误的。


我的代码确实是GB2312写的,在Linux下运行
谢谢你的回复,我会测试一下

#12


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

#13


应该这样写:
std::string str = "中文文件名"; 
QString strFileName = QTextCodec::codecForName("gb2312")->toUnicode(str.c_str());

#14


源码保存为utf-8的吧

#1


设置成QTextCodec::setCodecForTr(QTextCodec::codecForName("gbk"));试试看

#2


楼上的,请看清楚内容在回答,别几个帖子只会用这一句回答!

十万火急!知道的请告知,谢谢

#3


QTextCodec::codecForName("GB2312")->toUnicode(str);

其中str就是你从gb2312文件中读取出来的数据,最好保持const char*形式传进去,toUnicode()函数返回的就是你想要的

#4


首先把strFileName存为QChar *

我实际案例中定义的是QChar *szStr;//自己去分配,这里不细说。
然后
    QString strTmp;

    strTmp = "";

    for ( int i = 0; i < 1024; i++)
    {
        if ( szStr[i] == QChar(0))
            break;
        else
            strTmp.append(szStr[i]);
    }

    return strTmp;

这时的strTmp就是你要的串。

#5


过滤下

#6


如果你的代码是以GB2312书写的,那么你应该在main函数做如下设置:

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));

#7


补充一下,如果你的程序在Linux下运行,那么你应该在main函数中做如下设置:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

你在情况一和情况二中,均使用相同的设置,一定是错误的。

#8


不太懂,顶一下。我写的程序只能放到英文路径下,并且提示信息全是英文的,挺苦恼。

#9


gbk与utf8互转的问题我也折腾了许久,我也是在Windows下写代码,然后到linux下交叉编译,运行在ARM目标板中。目前问题也解决,在我的贴子里6楼7楼,已把解决的方法写了出来,不过奇怪的是我发的这两个回复自己看不到,但在结贴管理里面有,然后想重新回复是又提示不能连续3次回复,CSDN真是蛋疼,不知你们碰过这种情况没?
http://topic.csdn.net/u/20111221/14/e2d75d46-6822-4a84-99f3-c3f462bd072c.html?22844

#10


引用 9 楼 weichaogui 的回复:
gbk与utf8互转的问题我也折腾了许久,我也是在Windows下写代码,然后到linux下交叉编译,运行在ARM目标板中。目前问题也解决,在我的贴子里6楼7楼,已把解决的方法写了出来,不过奇怪的是我发的这两个回复自己看不到,但在结贴管理里面有,然后想重新回复是又提示不能连续3次回复,CSDN真是蛋疼,不知你们碰过这种情况没?
http://topic.csdn.net/u/20111221/1……


既然Qt已经提供了那么强大的编码转换功能,就应该熟悉怎么用。处理过程中出现乱码,很大可能性是我们使用、设置的错误。我是不想再使用额外的库或者自己再去实现。

#11


引用 6 楼 xiachm 的回复:
如果你的代码是以GB2312书写的,那么你应该在main函数做如下设置:

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));

引用 7 楼 xiachm 的回复:
补充一下,如果你的程序在Linux下运行,那么你应该在main函数中做如下设置:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

你在情况一和情况二中,均使用相同的设置,一定是错误的。


我的代码确实是GB2312写的,在Linux下运行
谢谢你的回复,我会测试一下

#12


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

#13


应该这样写:
std::string str = "中文文件名"; 
QString strFileName = QTextCodec::codecForName("gb2312")->toUnicode(str.c_str());

#14


源码保存为utf-8的吧