Qt5乱码

csdnbuku 2015-11-14 11:50:59
Qt5默认是使用utf-8吗?那为什么写入文本时是文本是gbk格式。
而使用了
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
之后是保存为utf-8不写BOM格式。然后qDebug出来的文本都是乱码。
读取utf-8不写BOM文本时,也是乱码。
那么怎么才能够将文本保存utf-8写入BOM格式呢?因为我在处理这个格式的文本时是正常的。而只要带有BOM,处理起来又都是乱码。总之,烦人!默认的GBK虽然没有问题,但不够用,而utf-8默认又是保存为不写BOM格式的,读取起来又是乱码。
求大神解答!
以上一大堆废话:一句话概括:
保存文件时怎么保存为utf-8写入BOM?也就是我们记事本所谓的utf-8格式。
多谢!
...全文
310 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
astro_lee 2015-11-23
  • 打赏
  • 举报
回复
----Qt写文本文件如何写入bom?
QTextStream::setGenerateByteOrderMark(bool generate);
把这个属性设置为true,在使用utf字符集的时候,QTextStream默认写入BOM到文件最开始处,注意:QTextStream默认使用QTextCodec::codecForLocale()作为字符集。 ----乱码问题 MSVC的运行字符集为ANSI,对于简体中文的系统来说就是:代码页-936,也就是gbk。楼主乱码的原因就是MSVC在运行的时候把utf8的字符串当作gbk来解析了,自然是乱码。解决这个问题有2个参考办法: 1、把cpp编码改为gbk,这样文件编码就和MSVC的运行字符集对应:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("gbk"));
qDebug() << QString::fromLocal8Bit("中文");
2、把cpp编码改为utf8-bom,之所以带bom,是因为cl只能识别带bom的utf8 cpp,然后在每个文件的开始加上:#pragma execution_character_set("utf-8"),把运行字符集改为utf8,注意用这个命令VS2010要打sp补丁,2010之前版本不支持。
qDebug() << QString::fromUtf8("中文");
或者直接:
qDebug() << QString("中文");
因为Qt5的QString(const char *)默认用fromUtf8来转换。
csdnbuku 2015-11-23
  • 打赏
  • 举报
回复
引用 25 楼 Kenier 的回复:
----Qt写文本文件如何写入bom?
QTextStream::setGenerateByteOrderMark(bool generate);
把这个属性设置为true,在使用utf字符集的时候,QTextStream默认写入BOM到文件最开始处,注意:QTextStream默认使用QTextCodec::codecForLocale()作为字符集。 ----乱码问题 MSVC的运行字符集为ANSI,对于简体中文的系统来说就是:代码页-936,也就是gbk。楼主乱码的原因就是MSVC在运行的时候把utf8的字符串当作gbk来解析了,自然是乱码。解决这个问题有2个参考办法: 1、把cpp编码改为gbk,这样文件编码就和MSVC的运行字符集对应:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("gbk"));
qDebug() << QString::fromLocal8Bit("中文");
2、把cpp编码改为utf8-bom,之所以带bom,是因为cl只能识别带bom的utf8 cpp,然后在每个文件的开始加上:#pragma execution_character_set("utf-8"),把运行字符集改为utf8,注意用这个命令VS2010要打sp补丁,2010之前版本不支持。
qDebug() << QString::fromUtf8("中文");
或者直接:
qDebug() << QString("中文");
因为Qt5的QString(const char *)默认用fromUtf8来转换。
已关注。 这是我另一个未结问题: http://bbs.csdn.net/topics/391858288 麻烦 层主有空帮忙看看。
csdnbuku 2015-11-23
  • 打赏
  • 举报
回复
引用 25 楼 Kenier 的回复:
----Qt写文本文件如何写入bom?
QTextStream::setGenerateByteOrderMark(bool generate);
把这个属性设置为true,在使用utf字符集的时候,QTextStream默认写入BOM到文件最开始处,注意:QTextStream默认使用QTextCodec::codecForLocale()作为字符集。 ----乱码问题 MSVC的运行字符集为ANSI,对于简体中文的系统来说就是:代码页-936,也就是gbk。楼主乱码的原因就是MSVC在运行的时候把utf8的字符串当作gbk来解析了,自然是乱码。解决这个问题有2个参考办法: 1、把cpp编码改为gbk,这样文件编码就和MSVC的运行字符集对应:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("gbk"));
qDebug() << QString::fromLocal8Bit("中文");
2、把cpp编码改为utf8-bom,之所以带bom,是因为cl只能识别带bom的utf8 cpp,然后在每个文件的开始加上:#pragma execution_character_set("utf-8"),把运行字符集改为utf8,注意用这个命令VS2010要打sp补丁,2010之前版本不支持。
qDebug() << QString::fromUtf8("中文");
或者直接:
qDebug() << QString("中文");
因为Qt5的QString(const char *)默认用fromUtf8来转换。
终于看到我想要的答案了。 非常感谢!层主果然是高手。 原来QTextStream 有这个用法。
csdnbuku 2015-11-22
  • 打赏
  • 举报
回复
引用 21 楼 csdnbuku 的回复:
[quote=引用 20 楼 cml26 的回复:] 在出现中文的那个头文件或者源文件的最开头写上 # pragma execution_character_set("utf-8") 就可以解决中文乱码了 我在Qt5.5里都是这么用的,东西写入记事本也没有问题
试了下,东西写入记本事不是UTF-8格式的。不符合我的要求。 我的要求是写入文本时保存UTF-8写入BOM格式(如果用我上面的两句代码,写入后用记本事查看是UTF-8格式,但用专业的编辑器 cnbook、ue等另存为时查看是UTF-8写入BOM格式的)而我要的是这种: 也就是它默认是不能打上勾。 我要的是具体的代码。肯定能实现。可是就是不知道怎么写! [/quote] 说错了一点:改正:cnbook、ue等另存为时查看是UTF-8写入BOM格式的→cnbook、ue等另存为时查看是UTF-8不写BOM格式的,也就是图中选项不能打上勾,都默认是打勾的。
csdnbuku 2015-11-22
  • 打赏
  • 举报
回复
引用 22 楼 csdnbuku 的回复:
[quote=引用 21 楼 csdnbuku 的回复:] [quote=引用 20 楼 cml26 的回复:] 在出现中文的那个头文件或者源文件的最开头写上 # pragma execution_character_set("utf-8") 就可以解决中文乱码了 我在Qt5.5里都是这么用的,东西写入记事本也没有问题
试了下,东西写入记本事不是UTF-8格式的。不符合我的要求。 我的要求是写入文本时保存UTF-8写入BOM格式(如果用我上面的两句代码,写入后用记本事查看是UTF-8格式,但用专业的编辑器 cnbook、ue等另存为时查看是UTF-8写入BOM格式的)而我要的是这种: 也就是它默认是不能打上勾。 我要的是具体的代码。肯定能实现。可是就是不知道怎么写! [/quote] 说错了一点:改正:cnbook、ue等另存为时查看是UTF-8写入BOM格式的→cnbook、ue等另存为时查看是UTF-8不写BOM格式的,也就是图中选项不能打上勾,都默认是打勾的。[/quote]
引用 22 楼 csdnbuku 的回复:
[quote=引用 21 楼 csdnbuku 的回复:] [quote=引用 20 楼 cml26 的回复:] 在出现中文的那个头文件或者源文件的最开头写上 # pragma execution_character_set("utf-8") 就可以解决中文乱码了 我在Qt5.5里都是这么用的,东西写入记事本也没有问题
试了下,东西写入记本事不是UTF-8格式的。不符合我的要求。 我的要求是写入文本时保存UTF-8写入BOM格式(如果用我上面的两句代码,写入后用记本事查看是UTF-8格式,但用专业的编辑器 cnbook、ue等另存为时查看是UTF-8写入BOM格式的)而我要的是这种: 也就是它默认是不能打上勾。 我要的是具体的代码。肯定能实现。可是就是不知道怎么写! [/quote] 说错了一点:改正:cnbook、ue等另存为时查看是UTF-8写入BOM格式的→cnbook、ue等另存为时查看是UTF-8不写BOM格式的,也就是图中选项不能打上勾,都默认是打勾的。[/quote] 都→而。反正乱了。没人能听懂我说什么。
csdnbuku 2015-11-22
  • 打赏
  • 举报
回复
引用 20 楼 cml26 的回复:
在出现中文的那个头文件或者源文件的最开头写上
# pragma execution_character_set("utf-8")
就可以解决中文乱码了
我在Qt5.5里都是这么用的,东西写入记事本也没有问题

试了下,东西写入记本事不是UTF-8格式的。不符合我的要求。
我的要求是写入文本时保存UTF-8写入BOM格式(如果用我上面的两句代码,写入后用记本事查看是UTF-8格式,但用专业的编辑器
cnbook、ue等另存为时查看是UTF-8写入BOM格式的)而我要的是这种:

也就是它默认是不能打上勾。
我要的是具体的代码。肯定能实现。可是就是不知道怎么写!
Scarlett26 2015-11-21
  • 打赏
  • 举报
回复
在出现中文的那个头文件或者源文件的最开头写上 # pragma execution_character_set("utf-8") 就可以解决中文乱码了 我在Qt5.5里都是这么用的,东西写入记事本也没有问题
csdnbuku 2015-11-20
  • 打赏
  • 举报
回复
我的问题是: 使用Qt5在本地写入文本(a.txt)时怎么保存为utf-8写入BOM?也就是我们记事本所谓的utf-8格式。 而使用 QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(codec); 这句代码,是可以保存为UTF-8格式,可是用专门的编辑器一看,却是UTF-8不写BOM格式的。(读取UTF-8不写BOM格式的文本都是各种乱码。所以我很讨厌。)
csdnbuku 2015-11-20
  • 打赏
  • 举报
回复
引用 16 楼 tiancai1912 的回复:
不太可能是编码的问题,就不要太纠结这个了,qt5里面都是默认utf8编码,不会出错的,显示不了,只可能是字库的问题,对应的lib/fonts/目录下没有字库。
你用Qt5在本地写入一个文本时,这个文本默认是GBK格式吗? 如果我想让它写入时保存为UTF-8写入BOM格式怎么怎么改? 如果是:QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(codec); 这样,它是保存为UTF-8不写BOM格式的。 这个才是问题所在,我的问题本质不是说乱码。
csdnbuku 2015-11-20
  • 打赏
  • 举报
回复
引用 15 楼 byy1990 的回复:
main函数中添加以下代码 QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForLocale(QTextCodec::codecForLocale()); QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); 然后 QString str = "测试"; 写文件,正常的中文! 如果异常的话,可能是记事本的显示格式不对, 使用notepad++打开,菜单里有格式,使用以utf-8无bom格式编码查看!
你这个的Qt4上的,我说的Qt5的,有点不一样。
tiancai1912 2015-11-20
  • 打赏
  • 举报
回复
不太可能是编码的问题,就不要太纠结这个了,qt5里面都是默认utf8编码,不会出错的,显示不了,只可能是字库的问题,对应的lib/fonts/目录下没有字库。
LittleNumb 2015-11-18
  • 打赏
  • 举报
回复
main函数中添加以下代码 QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForLocale(QTextCodec::codecForLocale()); QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); 然后 QString str = "测试"; 写文件,正常的中文! 如果异常的话,可能是记事本的显示格式不对, 使用notepad++打开,菜单里有格式,使用以utf-8无bom格式编码查看!
冷静忍耐 2015-11-16
  • 打赏
  • 举报
回复
引用 5 楼 u013466477 的回复:
工具-》选项-》行为,看文件编码
下面不是有一项为UTF-8 BOM??那你改为带BOM的
csdnbuku 2015-11-16
  • 打赏
  • 举报
回复
引用 8 楼 u013466477 的回复:
保存文件时怎么保存为utf-8写入BOM?也就是我们记事本所谓的utf-8格式。 文件编码不是可以改吗 [quote=引用 6 楼 csdnbuku 的回复:] [quote=引用 5 楼 u013466477 的回复:] 工具-》选项-》行为,看文件编码
引用 5 楼 u013466477 的回复:
工具-》选项-》行为,看文件编码
UTF-8[/quote] 保存文件时怎么保存为utf-8写入BOM?也就是我们记事本所谓的utf-8格式。 看图,文件编码不是可以改吗,或者你可以用UE、notepad++转[/quote] 这里的文件编码就是默认是UTF-8啊,然而并没有什么用。 如果我什么都不加,写入文件时就是GBK格式。我加了这句 QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(codec); 写入文件是保存为UTF-8不写BOM 。然后qDebug出来也是乱码,打开文件也是乱码。 我不希望它保存为是不写BOM格式,因为这样,我处理起来都是各种乱码。我当然可以通过编辑器改过来,可是这样认麻烦 ,很繁琐,很不友好啊。
冷静忍耐 2015-11-16
  • 打赏
  • 举报
回复
保存文件时怎么保存为utf-8写入BOM?也就是我们记事本所谓的utf-8格式。 文件编码不是可以改吗
引用 6 楼 csdnbuku 的回复:
[quote=引用 5 楼 u013466477 的回复:] 工具-》选项-》行为,看文件编码
引用 5 楼 u013466477 的回复:
工具-》选项-》行为,看文件编码
UTF-8[/quote] 保存文件时怎么保存为utf-8写入BOM?也就是我们记事本所谓的utf-8格式。 看图,文件编码不是可以改吗,或者你可以用UE、notepad++转
csdnbuku 2015-11-16
  • 打赏
  • 举报
回复
csdnbuku 2015-11-16
  • 打赏
  • 举报
回复
引用 5 楼 u013466477 的回复:
工具-》选项-》行为,看文件编码
引用 5 楼 u013466477 的回复:
工具-》选项-》行为,看文件编码
UTF-8
冷静忍耐 2015-11-16
  • 打赏
  • 举报
回复
工具-》选项-》行为,看文件编码
csdnbuku 2015-11-16
  • 打赏
  • 举报
回复
引用 10 楼 u013466477 的回复:
[quote=引用 5 楼 u013466477 的回复:] 工具-》选项-》行为,看文件编码
下面不是有一项为UTF-8 BOM??那你改为带BOM的[/quote] 改了,根本没有什么用。还是UTF-8不写BOM。那个应该只是代码cpp 的编码。 我想在本地写入txt文件时是 UTF-8带BOM的(记事本看不到是否写入,要用专门编辑器) 。
csdnbuku 2015-11-16
  • 打赏
  • 举报
回复
引用 11 楼 shihoongbo 的回复:
首先,这段代码Qt5里已经不推荐了 其次,显示中文的cpp请用记事本打开,另存为utf8 第三,中文文本用QStringLiteral()括起来
这些我都做了。还是有问题,我要在Qt5中使用UTF-8编码必须要加这两句编码,要不然处理GBK以处的编码就会乱码。
加载更多回复(6)

16,223

社区成员

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

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