vc++中字符集、字符编码、宽字符、窄字符 、utf8、gbk之间关系和转换

来源:赵克立博客 分类: C/C++ 标签:编码编码发布时间:2022-10-06 12:46:06最后更新:2022-11-03 15:39:41浏览:329
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2022-11-03 15:39:41
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

简述

一定要区别字符集和字符编码,不要搞混了,Vc++开发中下面设置的是字符集,不是字符编码。

2210061665032247318505.png

字符集

字符集是把每个文字对应的编码成一个数字,用这个数字代表一个文字。以可以表示中文的字符集为例有:gbk,Unicode, (当然还gb2312等先忽略),gbk为本地字符集只在中国用,unicode是国际字符集,可以全世界通用。

为什么说是gbk只在中国能用呢,因为历史原因unicode还没出现之前,各国家地区为了使用计算机都发明了自己的字符集,并且这些字符集互相都有重复的地方,比如数字 234 在中国代表一个中文字符,但是在印度可能就代表了另一个字符,同样在其它国家都有这样的情况,这些编码是重复的。

随着计算机的全球大流行,unicode字符集出现了,就是为了解决了这个问题,它是一个超级大的字符集表,把全世界的字符都进行编码。而前面说的各个国家的自用字符集统称为Ansi字符集。

最终字符集归为两种Ansi和unicode两种

字符编码

字符编码是一个字符在字符集中对应的数字,在计算机内存中的表示方式(存储方式),比如一个文本字符对应的数字码在内存中应该怎么保。

Ansi的编码方式按各个国家自己定的规则也保存,比如GBK:中文每个字符占用2个字节,英文1个字节

unicode字符集字符很多,只用一个字节所代表的整数是不能表示所有字符的,所以需要多个字节来表示字符,但一些全英文的国家,字符比较少,只用一个字节就可以表示出来他们用的所有字符,这就涉及到使用这些字符时存储和传输问题了。


特别是传输,不同编码方式会影响很大。英文语言国家本来一个字母一个字节都够用了,你现在让它们用两个字节传一个字母,那对流量和存储介质是大大的浪费。

因为unicode字符集是要全球大一统的,所以需要出一个大家都能接受的方案,于是针对unicode字符集又出了一些编码方式,

Unicode 可以使用的编码方案有三种,分别是:

  1. UTF-8:一种变长的编码方案,使用 1~6 个字节来存储;

  2. UTF-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;

  3. UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。


UTF-8:中文每个字符占用3个字节,英文一个字节,具体的内存存储方式可以自行查阅相关文献

宽字符和窄字符(多字节字符)

有的编码方式采用 1~n 个字节存储,是变长的,例如 UTF-8、GB2312、GBK 等;如果一个字符使用了这种编码方式,我们就将它称为多字节字符,或者窄字符。


有的编码方式是固定长度的,不管字符编号大小,始终采用 n 个字节存储,例如 UTF-32、UTF-16 等;如果一个字符使用了这种编码方式,我们就将它称为宽字符。


Unicode 字符集可以使用窄字符的方式存储,也可以使用宽字符的方式存储;GB2312、GBK、Shift-JIS 等国家编码一般都使用窄字符的方式存储;ASCII 只有一个字节,无所谓窄字符和宽字符。


下图是字符A在不同编码时所占的内存字节数。第二个宽字符内存里显示只有两个字节,但实际sizeof时是4个字节,每个字符占两个字节,空字符也但两个,内存显示两个是因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x41、0x00的顺序保存在记忆体中。如果检查Unicode文字的电脑储存应注意这一点。

2210071665155494299250.png


微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python