代码在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()函数返回的就是你想要的
其中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就是你要的串。
我实际案例中定义的是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"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
#7
补充一下,如果你的程序在Linux下运行,那么你应该在main函数中做如下设置:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
你在情况一和情况二中,均使用相同的设置,一定是错误的。
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
http://topic.csdn.net/u/20111221/14/e2d75d46-6822-4a84-99f3-c3f462bd072c.html?22844
#10
既然Qt已经提供了那么强大的编码转换功能,就应该熟悉怎么用。处理过程中出现乱码,很大可能性是我们使用、设置的错误。我是不想再使用额外的库或者自己再去实现。
#11
我的代码确实是GB2312写的,在Linux下运行
谢谢你的回复,我会测试一下
#12
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("System"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("System"));
QTextCodec::setCodecForTr(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());
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()函数返回的就是你想要的
其中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就是你要的串。
我实际案例中定义的是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"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
#7
补充一下,如果你的程序在Linux下运行,那么你应该在main函数中做如下设置:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
你在情况一和情况二中,均使用相同的设置,一定是错误的。
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
http://topic.csdn.net/u/20111221/14/e2d75d46-6822-4a84-99f3-c3f462bd072c.html?22844
#10
既然Qt已经提供了那么强大的编码转换功能,就应该熟悉怎么用。处理过程中出现乱码,很大可能性是我们使用、设置的错误。我是不想再使用额外的库或者自己再去实现。
#11
我的代码确实是GB2312写的,在Linux下运行
谢谢你的回复,我会测试一下
#12
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("System"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("System"));
QTextCodec::setCodecForTr(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());
std::string str = "中文文件名";
QString strFileName = QTextCodec::codecForName("gb2312")->toUnicode(str.c_str());
#14
源码保存为utf-8的吧