zoukankan      html  css  js  c++  java
  • VS工程属性“字符集”和源文件“高级保存选项”字符集区别

    项目--属性--设置属性--常规--字符集,VS2015默认为Unicode字符集。

    一、工程字符集属性

    工程属性里,字符集可以选择“使用Unicode字符集”和“使用多字节字符集”。此选项只控制代码里的API是用宽字符版(即Unicode)的还是ANSI字符版(即GBK)的,它控制不了代码里的字符是用Unicode编码还是ANSI编码。


    如果选择了“使用Unicode字符集”,则代码里用到的API被解释为Unicode版本的API(带标记W的API),如MessageBox被解释为MessageBoxW;
    如果选择了“使用多字节字符集”,则代码里用到的API被解释为ANSI编码版本的API(带标记A的API),如MessageBox被解释为MessageBoxA。

    二、字符编码

    “中” :GBK编码为[0xD6,0xD0],Unicode编码为[0x4E,0x2D], UTF8编码为[0xE4,0xB8,0xAD]

    (注:安利一个编码查询网站:https://www.qqxiuzi.cn/bianma/zifuji.php)

    假设当前OS(操作系统)的字符集为GBK,则:

    1 . 源代码文件里面的字符集

         使用当前OS的字符集GBK保存源程序,如“中”字的编码值为[0xD6,0xD0]。则在源程序的cpp文件中“中”字就是编码值0xD6D0的形式保存。

    2 . 运行时字符串变量的字符集

    字符变量的字符编码是由操作系统的字符集和前缀L来决定的:

    1> 如果字符串常量前面如果有标识L,则无论系统的字符集是什么,被此字符串赋值的变量的内容都是Unicode编码的。编译器会将在cpp文件中以GBK编码保存的“中”字对应的Unicode编码的值0x4E2D赋值给字符串变量。

    2> 如果字符串常量前面没有标识L,那么被此字符串赋值的变量的内容是编译器默认字符集编码方式(VS编译器默认的字符集是操作系统的字符集,即为GBK)。

    例:

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int main()
    {
    	wchar_t   arr1[] = L"中";
    	char   arr2[] = "中";
    	cout << sizeof(arr1) << " " << sizeof(arr2) << endl;
    	char *p = (char*)arr1;
    	for (int i = 0; i < sizeof(arr1); ++i)
    		cout << showbase << hex << (int)*(p + i) << " ";
    	cout << endl;
    	p = arr2;
    	
    	for (int i = 0; i < sizeof(arr2); ++i) {
    		cout << hex << ((int)*(p + i) & 0xff) << " ";
    	}
    	cout << endl;
    	return 0;
    }

    VS2015输出:

    Linux g++输出:

    分析:因为wchar_t VS为2字节,g++为4字节,g++默认为UTF-8编码,但字符串常量前面如果有标识L,则无论是VS还是g++全部转换为Unicode编码。(因为X86平台是小端序,所以输出0x2d 0x4e,而不是“中”的Unicode编码:0x4e 0x2d)

    补充:

    Unicode编码需要考虑字节序问题。但UTF-8和GBK不需要考虑字节序。

    如果一个字符使用utf-8表示,就需要将这个字符的Unicode码,编码成字节数组,这里要注意“字节”“数组”这两个概念,所以对于字节数组写入内存时,只需要按照数组的顺序,一个一个字节写入,不存在高位和低位的问题。所以,一个汉字,在任何类型的CPU中生成的utf-8序列是一样的。这也是我们常说的,UTF-8是单字节编码的,不用考虑字节序问题。

    GBK也同理,需要参照区位表,将字符转化为字节数组,也属于单字节编码,不需要考虑字节序问题。

    “高级保存选项”源文件编码影响请参考:

    https://blog.csdn.net/a3192048/article/details/81510312

  • 相关阅读:
    阿波罗11号登月全套高清照片(16650张,67.1G)分享
    oracle ORA-02292: 违反完整约束条件
    三十六副寺庙对联,领略真正的大智慧!
    SpringCloud微服务架构及其示例
    IDEA怎么关闭暂时不用的工程
    关于解决Incorrect result size: expected 1, actual的问题
    Centos7安装redis6.0.6教程
    VMware安装CentOS7超详细版
    Spring5--@Indexed注解加快启动速度
    《程序员修炼手册》
  • 原文地址:https://www.cnblogs.com/a3192048/p/12241310.html
Copyright © 2011-2022 走看看