跨平台开发Qt及其他c++项目,源码文件采用utf-8编码格式到底带不带bom?


跨平台开发Qt项目时,一般在Windows上使用VS+Qt插件开发,毕竟VS的开发效率比Qt Creator更高一些,在Linux上则只能退而求其次使用Qt Creator开发。

VS和Qt Creator开发Qt项目的上传下载,存在VS项目和QT项目的转换流程,在Windows开发新增源码文件后,VS导出Qt项目文件,同时上传Qt项目文件和源码文件。Linux开发,更新下载后,Qt Creator打开Qt项目文件,上传时将Qt项目文件及源码文件同时上传,Windows更新下载后,VS通过Qt插件打开Qt项目文件。

有关VS和Qt Creator项目的互相转换和打开,详解请参考《VS项目与Qt项目互转和打开》。

一、跨平台源码文件格式问题

跨平台开发时,Windows和Linux的开发源码应该是一套源码,方便版本管理和维护,因此往往采用git或svn搭建同一个源码库,开发都是实时上传实时下载,要求Windows上传的源码能立即在Linux下载编译使用,同样Linux上传的源码也能立即在Windows下载编译使用。

但VS中默认创建的源码文件格式是gb2312格式,Qt Creator默认创建的源码文件格式是utf-8不带bom格式,此时Windows和Linux默认创建的源码文件互相不能成功编译。

二、VS和QT开发的源码文件格式编译特点

1、在VS开发环境特点

  • 在没有中文的时候,utf-8与utf-8bom都可以编译通过。
  • 在有中文的时候,utf-8编码,会编译报错。utf-8 bom可以编译通过。
  • 在有中文的时候,只要加上下面的代码,无论编码方式是什么,都可以编译通过。
    #pragma execution_character_set(“utf-8”)

2、在QT开发环境特点

  • 使用QT Creator 新建的文件,默认编码方式为无bom的utf-8。
  • 在没有中文的时候,utf-8与utf-8 bom,都编译正常。
  • 在有中文的时候,utf-8编译会报错,utf-8 bom编译正常。

三、跨平台开发源码文件格式选择

不仅Qt开发,现在linux平台下的GCC 4.6及以上的版本已经可以支持带BOM的源码了!!!!!

  • 源码文件有中文字符,一定要utf-8 带bom格式;
  • 源码文件没有中文字符,也可以utf-8不带bom格式。

四、源码文件格式转换

1、notepad++转换

Windows和Linux开发时,都可以安装notepad++工具,先将源码文件转为utf-8-bom编码格式,然后再编译上传。

2、VS2019转换

VS2019中也具有utf-8 带bom文件格式转换功能,但是默认菜单并没有该功能,因此可以通过配置添加该功能菜单。菜单:扩展——>自定义菜单,打开自定义窗口,在窗口中选择命令栏——>添加命令——>文件,选择添加“高级保存选项”,这样VS2019的文件菜单栏中会增加一个“高级保存选项”子菜单,可以将源码文件的格式直接保存为Unicode(utf-8 带签名)。

五、BOM介绍

1、什么是BOM?

BOM 是 byte-order mark 的缩写,是 “字节序标记” 的意思, 它常被用来当做标识文件是以 UTF-8、UTF-16 或 UTF-32 编码的标记。

在 Unicode 编码中有一个叫做 “零宽度非换行空格” 的字符 ( ZERO WIDTH NO-BREAK SPACE ), 用字符 FEFF 来表示。

对于 UTF-16 ,如果接收到以 FEFF 开头的字节流, 就表明是大端字节序,如果接收到 FFFE, 就表明字节流 是小端字节序。

UTF-8 没有字节序问题,上述字符只是用来标识它是 UTF-8 文件,而不是用来说明字节顺序的。“零宽度非换行空格” 字符 的 UTF-8 编码是 EF BB BF,所以如果接收到以 EF BB BF 开头的字节流,就知道这是UTF-8 文件。

下面的表格列出了不同 UTF 格式的固定文件头:

UTF编码 固定文件头
UTF-8 EF BB BF
UTF-16LE FF FE
UTF-16BE FE FF
UTF-32LE FF FE 00 00
UTF-32BE 00 00 FE FF

2、utf-8带BOM与不带BOM的区别?

带bom 的utf-8 与不带bom的utf-8的区别在于有没有bom。就是在文件的最开头有没有"EF BB BF",也就是说有没有这个标记。

3、BOM带还是不带?

不仅Qt开发,现在linux平台下的GCC 4.6及以上的版本已经可以支持带BOM的源码了!!!!!

  • 源码有中文字符,跨平台编译的情况utf-8一定要带BOM;
  • 源码没有中文字符,跨平台编译的情况utf-8可以不带BOM。

参考:
1、https://blog.csdn.net/leeta521/article/details/119378886;
2、https://blog.csdn.net/fanpei_moukoy/article/details/21464305;
3、https://juejin.cn/post/6884571798751412238.

猜你喜欢

转载自blog.csdn.net/weixin_43369786/article/details/129541986
今日推荐