将一个只用到标准库函数的 C 程序在 Windows 平台上用 VS 2010 编译,没有出任何问题。再将它放到 64 位 CentOS 6.8 下,用 GCC 编译它,接收到一大堆警告和错误报告,如下图:
其中大部分是“null character(s) ignored”警告,还有一些像stray '***' 这样的错误。经过调查发现,原因在于在 Windows 平台上用文本编辑器保存这个 C 程序时,因为在其中用中文写了一些注释,保存时 Visual Studio 2010 IDE 显示了以下警告:
warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
于是在文本编辑器中保存时,将编码设置为了 UNICODE,但是 GCC 编译器不能识别 UNICODE 编码格式的源文件,就会产生如上图所示的警告和错误。(注意: UNICODE 本身是一个很大的概念,包含 UTF-8、UTF-16、UTF32。但 Windows 平台上的 UNICODE 实质上是指 UTF-16 编码,Linux 平台上通常采用 UTF-8 编码。)
由于只是想让这个 C 程序在 CentOS 6.8 上能执行,并不需要在 Linux 下编辑它,而且中文字符仅在程序的注释中出现,所以最简单的解决方法就是在 Windows 平台上用文本编辑器(比如 Notepad、Notepad++ 等)将这个 C 程序的源文件转换成 ASCII 编码或 UTF-8 编码。从 Windows 7 开始,自带的记事本 Notepad 在“另存为”时都允许用户选择编码方式。如下图所示:
于是只需用记事本将原来的 C 程序另外保存一份,编码选择 ASNI 或 UTF-8 都可以,接下来将新保存的文件拿到 CentOS 6.8 下用 GCC 编译。此时程序就能顺利地被编译,GCC 不再报告警告和错误了。
Windows 下的 Visual Studio 能够很好地自动识别源程序的编码方式,经过实验后发现:通过使用 Notepad 程序,将上面的 C 程序文件以 ANSI、Unicode、Unicode big endian、UTF-8 四种编码方式分别保存,在 VS 2010 中分别编译,都能够成功编译,不会像 GCC 那样产生警告和错误。
(特别注意:使用 Notepad 程序将源文件以 UTF-8 编码方式保存时,实际上是以 UTF-8 + BOM 编码方式保存的!)