Fork me on GitHub

MFC之多字节和宽字节的总结

ANSI字符集  所支持的就是多字节的也叫窄字节,类型来说就对应char类型。
Unicode字符集 也叫宽字符集 所支持的就是宽字符集,从类型上来说就是 wchar_t类型。
gb2312是中国的编码,Big5是中国香港和中国台湾的编码。
为什么有时我们所做的程序会出现乱码呢?

首先编码就是一个编码对应一个字符,gb2312 用2个字节表示所有的汉字,也就可能从0开始表示2^15个中文所用到的字符。
Big5也是用两个字节表示繁体字,也有可能是从0x0000 到0xFFFF区间表示繁体字。
因为编码的人只想编排自己地区所使用的字符,所以,在每个字节进行与字符对应的时候存在语言混淆的可能。

比如一个字简体的”国“和繁体的”國“,在gb2312中”国“字节编码是397A,在Big-5”國“是B0EA,那么这个简体的国如果不进行编码转换是无法从397A直接变成B0EA的,这个397A直接去对应Big-5的编码,就会是除了”國“字以外的其他繁体字了。那么gb2312的”国“用Big-5码显示出来就不是国对应的繁体字了。

所以就有了Unicode编码,它也叫统一编码。把全世界的语言字符拉通一一对应的编码。拉通就好比把全世界的字符通通从1开始数数 数一遍,并按数出来的数作为它的编码,这样就做到全世界的字符都是一 一对应的了。
那么繁体字,简体字,法文,俄文就不会有重叠的区域。这个时候“国”在unicode是 56EF表示,“國”是570B表示,如果生产者和用户都使用unicode编码,那么“国”和“國”就是因为使用的同一编码,生产者用unicode的56EF代表’国‘,用户用unicode翻译过来就是“国”;生产者用570B代表’國‘,用户用unicode翻译过来还是“國”,这就能编码和字符在生产者和用户上对应不变了。

在MFC中,ANSI字符集  所支持的就是多字节的也叫窄字节,类型来说就对应char类型。
Unicode字符集 也叫宽字符集 所支持的就是宽字符集,从类型上来说就是 wchar_t类型。
为了方便在不同的字符集上转换,就有了一种TCHAR类型,TCHAR能随着窄宽字节的变化自动变化。CString也是这样的。我们在定义CString的时候就需要使用的宏_T(“值”)或者TEXT(“值”)来表示文字了,这两个宏也是随编码不同,自动把里面的值转换成对应的编码。

区分一下 LPSTR(char*),LPCSTR(const char*)
     LPWSTR(wchar_t*),LPCWSTR(const wchar_t*)
     LPTSTR(TCHAR*),LPCTSTR(const TCHAR*)

 它们之间的转换转换:
https://blog.csdn.net/u012175637/article/details/80632687

posted @ 2020-04-13 17:30  HelloLLLLL  阅读(1188)  评论(0编辑  收藏  举报