Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1805|回复: 2
打印 上一主题 下一主题

Qt Creator下的编码问题 C4819: 该文件包含不能在当前代码页(936)中表示的字符

[复制链接]

1228

主题

1997

帖子

7586

积分

认证用户组

Rank: 5Rank: 5

积分
7586
跳转到指定楼层
楼主
发表于 2018-4-16 21:32:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Qter 于 2018-4-16 22:51 编辑

基于Qt creator开发 MinGW程序,
工具->选项->文本编辑器->行为
文件编码->
默认编码:UTF-8
UTF-8 BOM: 目前存在了则保留
以上为默认选项
但切换到MSVC2013 时,编译会报下面错误
warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失这样会导致文件不正确, 文件内含有中文

在当前文件下:编辑->Select Ecoding...
重新选择 GB2312
把编码重新载入,则文件出现乱码。
所以选择 按编码保存,则不会出现乱码,且保存拍,编译成功。  -----虽然源码中不显示乱码了,但程序发布后,显示中文为乱码.

但为了兼容 其它平台,还是统一去掉中文,转为支持多语言。






回复

使用道具 举报

1228

主题

1997

帖子

7586

积分

认证用户组

Rank: 5Rank: 5

积分
7586
沙发
 楼主| 发表于 2020-2-12 21:55:22 | 只看该作者
用 QtCreator + Visual C++ 编译器 编译程序时经常会出现类似的警告。
warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
这个警告我们可以忽略,但是编译大一点的项目时经常会提示几十个这样的警告,也挺烦人的。

其实解决办法也很简单,将我们的代码保存为 utf-8 带 BOM 格式的文件就可以了。QtCreator 保存文件默认是 utf-8 格式的,但是不带 BOM。
我们可以修改一下设置,让它每次保存是都保留 BOM。设置方法如下图:





回复 支持 反对

使用道具 举报

1228

主题

1997

帖子

7586

积分

认证用户组

Rank: 5Rank: 5

积分
7586
板凳
 楼主| 发表于 2020-2-12 22:24:24 | 只看该作者
本帖最后由 Qter 于 2021-4-4 07:04 编辑

一个汉字在不同的编码方式中占多少字节?

       1.在UTF-8中,一个汉字占3个字节(一个字符占一个字节)

      2.在ASCII码中,一个汉字占2个字节(一个字符占一个字节)

      3.在Unicode编码中,一个汉字占2个字节(一个字符同样占两个字节,所以JAVA中char a = '中';是可以的)

BOM即byte order mark

UTF-8文件中放置BOM主要是微软的习惯,但是放在别的系统上会出现问题。

不含BOM的UTF-8才是标准形式,UTF-8不需要BOM

带BOM的UTF-8文件的开头会有U+FEFF,所以我新建的空文件会有3字节的大小。

三、创建UTF-8(而非UTF-8 BOM)文件的方法

在发现文件另存为UTF-8缺得到UTF-8 BOM文件后,我们怎样才能得到UTF-8呢?

法1.先另存为UTF-8保存,再使用notepad++打开,把里面的编码设置为无BOM的UTF-8然后保存。(此方法治标不治本,因为当你再次在里面写汉字时,文件会自动变成UTF-8 BOM)

法2.用JAVA代码

可以很轻松的创建UTF-8文件,且可以随便写汉字,文件字节数=汉字数*3

———————————————

BOM:byte order mark,定义字节顺序,因为网络传输中分为两种,大头和小头。uft-8不需要bom表明字节顺序,但可以用BOM来表示编码方式,windows就是采用bom来标记文本文件的编码方式的。


bom是为utf-16和utf-32准备的,用于标记字节顺序。微软在utf-8中使用bom是因为这样可以把UTF-8和ASCII等编码区分开来,但这样的文件在windows之外的操作系统里会带来问题。


不含bom的UTF-8才是标准形式。UTF-8」和「带 BOM 的 UTF-8」的区别就是有没有 BOM。即文件开头有没有 U+FEFF。

UTF-8 的网页代码不应使用 BOM,否则常常会出错。

————————————————

BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。UTF-8不推荐使用无意义的BOM,但许多Windows程序却在保存UTF-8编码的文件时将其存为带BOM的格式(即在文件开头加上0xEFBBBF三个字节),这么干的就包括Windows记事本,这种编码格式的文件在 Windows 之外的操作系统里会出现问题。

解决方案   

    建议大家使用Notepad++编辑,在 菜单栏-编码 中选择以 UTF-8 无BOM格式编码。


https://blog.csdn.net/esonbest1234/article/details/50729484
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-9 02:52 , Processed in 0.062078 second(s), 21 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表