在Visual Studio和XCode之间兼容性最好的文本编码

跨平台开发的文本编码问题

有一个跨平台的模块需要同时在Visual Studio 2013和XCode 8下开发,在开发过程中发现以下问题:

  • 在Visual Studio创建的代码文件,里面的中文注释在XCode下会显示成乱码:

  • 在XCode创建的代码文件,如果里面包含中文注释,在Visual Studio中编译时可能会产生C4819警告:

产生这些问题的原因是两款IDE对文本编码的支持方式不一致。为了解决它们,需要弄清楚Visual Studio和XCode的异同。

Visual Studio对文本编码的支持

Visual Studio的默认编码是ANSI,也就是Windows当前语言的编码。对于简体中文来说就是GB2312。默认编码无法设置。

打开了一个文件之后,在Visual Studio的“文件” - “高级保存选项”菜单中可以修改当前文件的编码:

在弹出的对话框中可以选择各种编码:

Visual Studio只能手动一个一个地转换文本编码,不能做到自动转换或者批量转换。

虽然在上面的列表中可以找到UTF-8 without BOM编码,并且Visual Studio也确实能够正确显示这种编码的文件内容,但实测发现编译器并不能很好地支持这种编码。例如,当文件中含有奇数个中文字符时,编译的时候会出现上文说的C4819警告;而当含有偶数个中文字符时,则一切正常。

XCode对文本编码的支持

XCode的默认编码是UTF-8 without BOM,可以在Preferences中修改默认编码:

在该选项中可以选择各种文本编码:

然而实测发现这个选项没有什么用。修改之后,新建的文件仍然是UTF-8编码,打开的文件也不会使用指定编码。

XCode并没有区分UTF-8 with BOM和UTF-8 without BOM,默认是UTF-8 without BOM,但它还是能够打开和编辑UTF-8 with BOM编码的文件。

打开了一个文件后,在Utilities面板中可以查看和设置当前文件使用的编码:

XCode的编码检测也不准确。例如,GB2312编码的文件会被检测为Western (Mac OS Roman),导致中文显示成乱码。

通过下拉列表修改了文本编码后,XCode会弹出以下的对话框,询问是要转换编码还是重新解析文件:

Convert选项会把当前文件转换成选择的编码;Reinterpret选项会以选择的编码重新解析当前文件。如果内容显示正常,只想改变编码的话,应该使用Convert;如果内容出现乱码,应该使用Reinterpret重新解析。

选择兼容性最好的文本编码

综合两款IDE对文本编码的支持情况,可以知道能够同时被Visual Studio和XCode支持的文本编码是:

  • UTF-8 with BOM
  • UTF-16 BE
  • UTF-16 LE
  • GB2312(以及其它区域语言)

对于代码文件,UTF-16比较浪费空间,所以首先排除掉。至于GB2312等区域语言,由于XCode无法正确检测出这种编码的文件,每次打开的时候都要手工转换一下,所以也不是理想的选择。

最后只剩下UTF-8 with BOM。Visual Studio和XCode都能够直接打开和编辑这种编码的文件,无需进行任何转换。遗憾的是,两款IDE都不能直接创建这种编码的文件,只能在创建之后再手工转换一下(XCode需要借助工具来转换)。虽然存在这个不足,不过UTF-8 with BOM是当前情况下兼容性最好的选择。