三个问题:
- C/C++源代码文件在windows+VS和Linux+GCC跨平台编译时候出现中文乱码问题。
- 换行问题。
- 缩进使用space还是tab。
当你开始用文本写程序的时候,一定会碰到文本编码的问题。
现在的win10系统新建文本文档默认编码是UTF-8编码了。
问题描述
比如在VS IDE里写的C/C++代码文件,拷贝到Linux平台使用GCC编译运行时候出现了中文注释乱码或者非ASCII字符乱码的问题。这是因为编码出现了问题。
【以VS2019,C++控制台应用为例】
通过vs创建的C++控制台应用工程附带自动创建的包含main函数文件是utf-8 with bom编码,这是因为这第一个文件是VS创建的,后面再通过VS新建的.h文件或者c/cpp文件都会自动使用操作系统的默认编码,国内是GB2312编码。然后把VS中的代码拷贝到Linux使用gcc编译会出现如上所说的乱码现象。这是因为GCC的源码字符集与执行字符集默认是UTF-8编码,但是中国人写点中文注释是不可避免的。
- 正常情况下:
在vs中新建文件时,该文件默认使用GB2312编码。因为windows控制台默认也是GB2312编码,所以一般情况下,都不会出现中文乱码。 - 错误情况下:
- 直接在项目中导入了其他已经创建好的源代码文件。如果该文件不是gb2312编码, 而且含有中文的话, 有可能会出现中文乱码。
- 从其他文件中复制代码到vs的文件中, 也可能导致编码错乱。
- 网络编程中, 和服务器交互通信, 两端的编码很可能不同。
windows查看默认编码:
中国地区一般是GB2312(GBK多点兼容gb2312,2312许多罕用字无法显示),这种统一保持了控制台应用程序编译输出中文不会出现乱码情况,但是这种统一是VS帮助我们完成了。
问题说完了,现在说说怎么解决。
说实话,很难抉择,跨平台编码问题编码难以两全。这还只是vs和 gcc,再引入android studio,xcode真会让人狂掉头发。开发工具要选择主流的,省去很多事情。
我个人推荐的做法,也是我目前使用的方法是当在windows上开发时候将所有代码文件保存成UTF-8 with bom编码格式。UTF8分为with bom和no bom,with bom是微软喜欢用的一套,VS中生成的文件也有是UTF-8 with bom的,该格式在VS环境下编译不会出现中文乱码情况。
为什么使用这种办法:
- 经实测,UTF-8 with bom格式在Ubuntu16+ gcc 10编译运行下也没有出现中文乱码情况。gcc/g++低版本不支持UTF-8 with bom格式,起码GCC4.4.0才支持UTF-8 BOM。
- UTF-8 with bom在VS 中有扩展应用可以使用,可以将文件默认保存成为UTF-8 BOM编码格式,不用单个文件一个个的使用高级保存或转换为UTF-8 BOM格式。也有将文件从utf-8 with bom转换成utf-8的扩展,使用方便。插件有ForceUTF8 ,两个版本(with BOM和no bom)。
- windows上开发的时候代码可以直接移植Linux,使用gcc编译。
还有许多其他办法,包括不限定修改windows控制台默认编码、gcc编译选项控制、cl编译选项控制。
这地方还有一个办法没有验证,注释中文使用 /空格xxxxxx空格/这种格式,但是无法解决打印中文的情况。
总结:
- 当进行跨平台开发时候要注意文件编码问题,保持文件编码统一,UTF-8 with bom编码在windows和gcc v4.4以上版本不会出现乱码。
- 从外部拷贝的代码或者拿来使用的源代码文件要尤其注意其编码格式。
- 跨平台开发缩进推荐使用空格。