当前位置:C++技术网 > 资讯 > [C++] 如何获取程序自身的编码

[C++] 如何获取程序自身的编码

更新时间:2017-05-04 23:46:49浏览次数:1+次

    通常来说,在 Visual Studio 编程环境下,可以通过宏 (_UNICODE) 来知道当前项目是 MBCS(多字节多字符集) 还是 UNICODE,但是还不够详细。

    我的项目中需要知道自身程序是何种编码。

    1. 例如我通过宏知道我是UNICODE的,但却不知道是以下的哪一种?

    UTF-8,

    UCS-2, UCS2BE, UCS-2LE,

    UCS-4,UCS-4BE,UCS-4LE,

    UTF-16,UTF-16BE,UTF16LE,

    UTF-32,UTF-32BE,UTF-32LE,

    UTF-7

    这就很难判断了,因为 Linux 和 Windows 的 UNICODE 是有区别的。


    2. Linux 的默认编码是 UTF-8,Windows (中国) 的默认编码是 GBK,运行起来的程序又是不同的编码,或者是MBCS,又或者是 UNICODE,但却又不知道详细的编码是什么?

    

    3.问题:

    究竟要什么代码才能实现 获取程序自身 编码详细内容呢?


    最后感谢C++技术网的回答。

    


C++技术网会员解答:

    您好,感谢您对C++技术网的眷顾和信任。

    字符编码是解释存储的数据的文本字符含义的方式。存储的同一份数据,可以根据不同的字符编码进行解码,可以得到不同的文字。如果按照A编码存储,按照其他编码解码,很可能出现其他编码不存在的编码值,也就出现了乱码。

    虽然编码就是这样的原理,但是为了更好的区分编码。很多编码会在文件开头加入特定的字节序列,用来和其他编码存储的文件区分。或者可以将这个字节序列看做是不同字符编码的标志。当然,没有这个标志,编码的文件不受影响。加不加这个标志,没有硬性规定。

    下面是参考的字符集开始标志字节序列:

EF BB BF UTF-8 
FE FF UTF-16/UCS-2, little endian 
FF FE UTF-16/UCS-2, big endian 
FF FE 00 00 UTF-32/UCS-4, little endian. 
00 00 FE FF UTF-32/UCS-4, big-endian.
    如果没有开头的标志字节序列,那么就要通过编码规律来分析了。比如ASCII编码的文件,编码值不会超过128。通过分析字节值,就可以分析到这个特征。当然这个不是绝对的。所以不同编码有不同编码的特征,所以这个需要从规律中总结,没有固定套路。

    而在编程中,为了更加明确快速的确定使用的编码,一般都会在文件开头指定编码方式。_UNICODE宏就是明确指定的方式来区分编码。Python代码文件、Html文件、xml文件都会指明存储文件时使用的编码格式。

    加入你真的不清楚当前代码使用的编码,可以在当前文件给字符串存储一个值,然后分析存储字符串的字节的数值,来分析数值的情况。比如:

char * str = "123";
    如果是ASCII编码,那么str占用了4个字节,如果是Unicode编码,那么存储了8个字节。如果是其他编码,自然是不同的字节数。如果通过字节数还是无法判定,可以再用指定编码存储的字符串和str字符串进行对比,如果一致,说明编码一致,如果str的结果和你指定存储的编码的字符串不一致,说明编码不同。

    基本上可以从起始标识、字节数和编码测试来判定,这个没有见过谁做过,你可以自己测试下,是个可行的方法。但主要还是通过各种标识说明来快速判断编码,自己测试是没有办法才做的。