1.常见的字符编码有GBK,GB2312,UTF8,Unicode,ISO
ASCII:是美国发明的最早的码表,里面只有128个字符,用一个字节的二进制数据就可以完全囊括,具体可以查看ASCII表。
ISO:是欧美发明的码表,除了前128个字符和ASCII一样之外,又添加了一些像法语,德语等专有字符,总共有256个字符,也只要用一个字节就可以囊括。
Unicode:万国码,它几乎将世界上所有的字母数字文字等各种字符都进行了编号,这个编号的范围从0x000000 到 0x10FFFF(十六进制),完整的Unicode需要三个字节才能去描述。
注:但计算机具体存储时使用的是二进制存储方式,并不能直接存储16进制数据,所以虽然可以直接将16进制转换成二进制进行存储,但是这样每个字符都需要3个字节来表示,对于英文字符太浪费空间了。并且无法区分Unicode与ASCII码,对于一个三字节的数据,可以把它看成一个Unicode字符,也可以看成ASCII码
UTF8:是Unicode转换成二进制的一种转换形式或者规则,这是一种边长的编码方式,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF8的编码规则:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
下表总结了编码规则,字母x表示可用编码的位。
GBK是中国国家制定编码,用来编码汉字,每个汉字占用双字节,有具体的编码表,可以和Unicode中的汉字一一对应
GB2312:是老版的中国汉字编码,没有GBK汉字全。
2.在windows VS中字符对应的编码
char是多字节,也就是可能占用一个字节,可能占用多个字节,根据存储内容不同来定。
当存储英文时是用ACSII码来存储,占用一个字节,存储中文时用GBK来存储(VS2013默认使用GBK,有待确认),占用两个字节。
void TestChar()
{
char ch1 = 's'; // 正确
cout << "ch1:" << ch1 << endl;
char ch2 = '中'; // 错误,一个char不能完整存放一个汉字信息
cout << "ch2:" << ch2 << endl;
char str[4] = "中"; //前三个字节存放汉字'中',最后一个字节存放字符串结束符\0
cout << "str:" << str << endl;
//char str2[2] = "国"; // 错误:'str2' : array bounds overflow
//cout << str2 << endl;
}
注:单个char只能存放一个字节,可以把单个char称为窄字节,char*才是真正的多字节
wchar_t是宽字节,是采用的Unicode编码,并且每个宽字节只占两个字节(并不知道微软如何把Unicode具体转换成两个字节的二进制数去存储的,如果需要utf8,需要额外转换)
void TestWchar_t()
{
wcout.imbue(locale("chs")); // 将wcout的本地化语言设置为中文,wcout不像cout可以直接输出中文
wchar_t wch1 = L's'; // 正确
wcout << "wch1:" << wch1 << endl;
wchar_t wch2 = L'中'; // 正确,一个汉字用一个wchar_t表示
wcout << "wch2:" << wch2 << endl;
wchar_t wstr[2] = L"中"; // 前两个字节(前一个wchar_t)存放汉字'中',最后两个字节(后一个wchar_t)存放字符串结束符\0
wcout << "wstr:" << wstr << endl;
wchar_t wstr2[3] = L"中国";
wcout << "wstr2:" << wstr2 << endl;
}
注意:表示多字节只需要加引号即可,但是表示宽字节要在引号前加L
TCHAR是通用版本,VS设置的字符集是什么,就是什么字符集
在这种情况下TCHAR就代表wchar_t
在这种情况下或者未设置时就是TCHAR就代表char,多字节。
CString就是以TCHAR为基础的,所以CString可以使用多字节或者宽字节
_T、TEXT、_TEXT这三个函数也是针对TCHAR的,所以设置的是什么字符集,就会转成什么格式。
3.windows中定义的一些宏如下,其中MBCS代表多字节,表示在不同字符集下,宏分表代表什么含义:
类型 | MBCS | UNICODE |
---|---|---|
WCHAR | wchar_t | wchar_t |
LPSTR | char* | char* |
LPCSTR | const char* | const char* |
LPWSTR | wchar_t* | wchar_t* |
LPCWSTR | const wchar_t* | const wchar_t* |
TCHAR | char | wchar_t |
LPTSTR | TCHAR*(或char*) | TCHAR* (或wchar_t*) |
LPCTSTR | const TCHAR* | const TCHAR* |
4.多字符集和宽字符集的互相转换
参考https://www.cnblogs.com/gune/p/6206720.html
注意一般A代表多字符,W代表宽字符,T代表TCHAR
5.多字节转utf8编码