[关闭]
@wz520 2015-07-28T09:28:48.000000Z 字数 1532 阅读 4341

解决 AStyle 的 "reverting to English" 问题

VS2010


AStyle 是一个开源跨平台的 C/C++/Java 代码整理工具。目前最新版本为 2.05.1 。

不知道从哪个版本开始,从官方下载的 EXE 在中文(包括简体和繁体) Windows 下运行会出现 Cannot convert to multi-byte string, reverting to English 的提示。

这通常并不影响处理结果。因为这个提示是输出到 stderr 上的。而处理结果都是输出到 stdout 上的。

但是如果调用 AStyle 的程序会将 stdout 和 stderr 的文本全部重定向到同一个地方(比如GVIM就会这么做),你会发现格式化后的代码的最后总是拖着上面这串提示,这实在让人不爽。

目前的解决办法如下:

加上 --ascii 参数

astyle --ascii

这么简单?对,就是这么简单!

用 VS2010 重新编译

尝试用 VS2010 重新编译了一下,发现不仅不加 -ascii 参数也不会出现上述警告提示,而且:

不过这里要注意,如果不加修改直接拿 build/VS2010/AStyle.sln 放到 VS2010 的 IDE 里去编译,会碰到一些问题,下面来说说如何解决。

解决编码问题

直接按 F7 编译,编译器会说 ASLocalizer.cpp 的编码有问题,随后会出现一些莫名其妙的错误,最终编译失败。

在 IDE 里双击打开 ASLocalizer.cpp,觉得很奇怪,如果编码有问题,怎么开头注释里面的中文、日文、韩文、俄文全部可以正常显示?再仔细看一下其他地方,没发现什么地方有乱码。那么这所谓的编码是编译器在卖萌吗……?

后来想想,问题可能出在编译器对编码的处理上。就是说编译器对源代码编码的处理方法和 IDE 不一样,造成一些让人摸不着头脑的错误。

具体的说,这个 ASLocalizer.cpp 的编码是 UTF-8 不带 BOM 的(使用 文件 -> 高级保存选项 即可看到)。

没有 BOM,对于 IDE 来讲,它会尽可能地识别出正确的编码。当它打开 ASLocalizer.cpp,会智能地识别出这是 UTF-8,所以不会有乱码。

但是编译器就没有这么聪明了,它没有看到 BOM 就一律按照当前系统的默认代码页来处理(简体中文系统下就是 CP936(简体中文GBK)),那么结果就是有些字符无法正确转换,导致编译错误。

但是,只要将 ASLocalizer.cpp 存成带 BOM 的 UTF-8 ,那么无论是 IDE 还是编译器都能正确处理了。

所以解决办法就是:

  1. 打开 ASLocalizer.cpp
  2. 文件 -> 高级保存选项 -> Unicode (UTF-8 带签名) - 代码页 65001 -> 确定
  3. 文件 -> 保存

然后再 F7 编译,一切OK 。

解决对运行库的依赖

默认会动态链接运行库,运行时需要 MSVCP100.DLL 和 MSVCR100.DLL 。
想取消依赖的话:

  1. 项目属性(Release) -> 配置属性 -> C/C++ -> 代码生成 -> 运行库
  2. 将“多线程DLL”改成“多线程”,确定,然后F7重新编译。

还是不喜欢中文提示

这个重新编译的版本会自动根据当前系统语言来显示提示信息。

中文系统下会显示中文。

但是与某些对编码处理不是很聪明的文本编辑器搭配使用时,中文提示可能会导致乱码(虽然这个工具只要参数正确很少会有警告信息)。要恢复为英文,那么只要:

astyle --ascii

没错,和不重新编译的解决方法完全一样,因为 --ascii 参数就是设置提示信息为英文。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注