visual c++ 7.1对源文件encoding的支持(收藏自http://blog.csdn.net/hansoft/archive/2005/10/17/505370.aspx)

C++的源文件首先是一个文本文件,因此必然涉及到encoding的问题,vc7.1能处理哪些encoding编码的源文件呢?以下是我对其进行的试验,我的环境是windows 2000简体中文版,系统和用户的locale设置都是中文(中国)。

  • 源文件采用iso-8859-1编码,包括除ascii以外的字符,例子是:
    #include <fstream>

    int main() {
    std::ofstream of("test");
    of << "aoû";

    return 0;
    }

    这里包括了一个法文字符û,其在iso-8859-1中的编码是FB。在IDE中双击打开该文件,却显示有异:
    #include <fstream>

    int main() {
    std::ofstream of("test");
    of << "ao?;

    return 0;
    }

    显然û没有显示出来,代之以一个?号,并且少了右边的一个双引号。这是因为此时vc editor是以一种自动检测编码的方式来打开文件的(如果你没有更改缺省打开方式的话),这种方式会尝试从文件的元信息中来得到其编码,然后用该编码来 解码文件。这种元信息最常见的就是BOM(Byte Order Mark)了,用来标识某文本采用编码是UTF-8,UTF-16,UTF-32之中的哪一个。但是这里使用的例子并没有BOM之类的元信息,此时vc editor就会用系统locale的encoding来打开文件,这里就是GBK了,FB(û)在GBK中会被认为是汉字的第一个字节,而后面的双引号 就会被当作第二个字节,由于这个FB 22在GBK中并不是一个汉字的有效编码,所以显示为了一个?号,同时也失去了右半个双引号。对这种情况,我们要做的就是告诉editor正确的编码,而 不是让它去用系统locale的。幸好vc7.1的有一个菜单项Open With,里面有一项:C++ Source Code Editor(with encoding),可以选择打开文件使用的编码,这里我选择Western European(ISO),显示结果正确了。 接下来进行编译,却被报告"error C2001: newline in constant",出在有法文符号的那行。细想一下,应该还是同样的原因,只不过这次遇到麻烦的是compiler,而不是editor了,这时我们可 以利用C/C++的Preprocessor指令setlocale来告诉compiler正确的编码,这里我写的是:#pragma setlocale("enu")
  • 对 源文件采用其他编码的情况,包括UTF-8,UTF-16(with BOM),UTF-16(little endian without BOM),UTF-16(little endian without BOM),关于editor就不用说了,只要选对相应的编码就能正确显示;对compiler,带有BOM的自不必说,即使不带BOM的UTF-16,编 译器也能检测出编码而不用setlocale。

要注意的一点是,如果vc editor识错编码的话,不但显示出来有误,当进行编辑后保存后,它还会自动地修改某些你并没有更改过的地方,对上面的例子,它会把FB 22(û")替换为3C(?),因为FB 22并不是一个有效的GBK编码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值