windows中的字符编码理解

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代表多字节,表示在不同字符集下,宏分表代表什么含义:

类型MBCSUNICODE
WCHARwchar_twchar_t
LPSTRchar*char*
LPCSTRconst char*const char*
LPWSTRwchar_t*wchar_t*
LPCWSTRconst wchar_t*const wchar_t*
TCHARcharwchar_t
LPTSTRTCHAR*(或char*)TCHAR* (或wchar_t*)
LPCTSTRconst TCHAR*const TCHAR*

 4.多字符集和宽字符集的互相转换

参考https://www.cnblogs.com/gune/p/6206720.html

注意一般A代表多字符,W代表宽字符,T代表TCHAR

5.多字节转utf8编码

参考文章http://blog.sciencenet.cn/blog-3134052-1073272.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows字体库是指Windows操作系统所包含的各种字体文件的集合,这些字体文件被用于在计算机上显示各种文字和图形。Windows字体库的字体映射表则是一个记录了字体文件与字符编码之间关系的列表。 在计算机,每个字符都对应着一个唯一的字符编码,这可以理解为计算机对字符的一种编号方式。而字体文件则是包含了各种字符的形状和样式的文件。字体映射表则是将字符编码与对应的字体文件进行关联,使得在计算机上可以根据字符编码来找到并显示对应的字形。 Windows字体映射表的作用是确保计算机可以正确地根据字符编码显示对应的字体样式和形状。当我们在使用文字处理软件、浏览网页或者进行其他与文字相关的操作时,计算机会根据字符编码去字体映射表寻找对应的字体文件,并将其渲染显示出来。如果字体映射表没有对应的字体文件,或者字符编码错误,那么计算机可能无法正确显示对应的字符Windows字体库有多种字体类型,如宋体、黑体、楷体等。每种字体类型又包含了不同的字体文件,如Regular、Bold、Italic等。字体映射表将这些字体文件与字符编码进行关联,使得计算机可以根据需要来选择合适的字体文件进行文字显示。这样,我们在计算机上看到的文字就能够具有各种不同的字形和样式,从而满足我们对文字外观的要求。 总而言之,Windows字体库的字体映射表是一个记录了字体文件与字符编码之间关系的列表,它确保计算机可以根据字符编码正确地显示对应的字体样式和形状,使得我们在计算机上能够看到各种不同的字形和样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值