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

Sky-Yang 2011-12-23 02:40:04
情况一:
代码在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并找到文件(不能修改文件名编码)???
...全文
597 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hi_52rock 2012-02-27
  • 打赏
  • 举报
回复
源码保存为utf-8的吧
cplusQt 2012-02-26
  • 打赏
  • 举报
回复
应该这样写:
std::string str = "中文文件名";
QString strFileName = QTextCodec::codecForName("gb2312")->toUnicode(str.c_str());
lovemyliwu 2012-01-13
  • 打赏
  • 举报
回复
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("System"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("System"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("System"));
Sky-Yang 2012-01-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiachm 的回复:]
如果你的代码是以GB2312书写的,那么你应该在main函数做如下设置:

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
[/Quote]
[Quote=引用 7 楼 xiachm 的回复:]
补充一下,如果你的程序在Linux下运行,那么你应该在main函数中做如下设置:

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

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

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

既然Qt已经提供了那么强大的编码转换功能,就应该熟悉怎么用。处理过程中出现乱码,很大可能性是我们使用、设置的错误。我是不想再使用额外的库或者自己再去实现。
weichaogui 2011-12-31
  • 打赏
  • 举报
回复
gbk与utf8互转的问题我也折腾了许久,我也是在Windows下写代码,然后到linux下交叉编译,运行在ARM目标板中。目前问题也解决,在我的贴子里6楼7楼,已把解决的方法写了出来,不过奇怪的是我发的这两个回复自己看不到,但在结贴管理里面有,然后想重新回复是又提示不能连续3次回复,CSDN真是蛋疼,不知你们碰过这种情况没?
http://topic.csdn.net/u/20111221/14/e2d75d46-6822-4a84-99f3-c3f462bd072c.html?22844
noodle123 2011-12-29
  • 打赏
  • 举报
回复
不太懂,顶一下。我写的程序只能放到英文路径下,并且提示信息全是英文的,挺苦恼。
xiachm 2011-12-27
  • 打赏
  • 举报
回复
补充一下,如果你的程序在Linux下运行,那么你应该在main函数中做如下设置:

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

你在情况一和情况二中,均使用相同的设置,一定是错误的。
xiachm 2011-12-27
  • 打赏
  • 举报
回复
如果你的代码是以GB2312书写的,那么你应该在main函数做如下设置:

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
凡员外 2011-12-26
  • 打赏
  • 举报
回复
过滤下
warknife 2011-12-26
  • 打赏
  • 举报
回复
首先把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就是你要的串。
wangxkww 2011-12-23
  • 打赏
  • 举报
回复
QTextCodec::codecForName("GB2312")->toUnicode(str);

其中str就是你从gb2312文件中读取出来的数据,最好保持const char*形式传进去,toUnicode()函数返回的就是你想要的
Sky-Yang 2011-12-23
  • 打赏
  • 举报
回复
楼上的,请看清楚内容在回答,别几个帖子只会用这一句回答!

十万火急!知道的请告知,谢谢
j_qinshou 2011-12-23
  • 打赏
  • 举报
回复
设置成QTextCodec::setCodecForTr(QTextCodec::codecForName("gbk"));试试看

16,818

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧