现在的位置: 首页 > 综合 > 正文

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

2013年01月13日 ⁄ 综合 ⁄ 共 1330字 ⁄ 字号 评论关闭

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编码。

抱歉!评论已关闭.