一、字符、字符集、字符编码
1.字符
字符就是我们日常生活中常用到的文字、符号或者有意义的图形。比如:字母‘A’,汉字‘中’,标点符号‘。’或者表情😊,它们都可以称为字符。
2.字符集
是字符的集合。比如ASCII码表里面的有256个字符,那么这256放在一起组成的集合就是ASCII字符集。
显然,除了ASCII字符集,还有GBK(这是一种将中文和一些参见符号集合在一起的字符集,其他几种不多做介绍)、UTF-8、UTF-16、UTF-32等字符集。
3.字符编码
字符编码就是字符集和计算机内存存储的二进制数字之间的一种映射关系。比如ASCII字符编码就是将ASCII字符集里的256个字符,每一个字符都用一个8位的二进制数来表示。
显然,除了ASCII字符编码,还有GBK、UTF-8、UTF-16、UTF-32等字符编码。
二、字符集和字符编码的关系
下面通过具体例子(以GBK作为例子)介绍一下他们的关系
1.关系:
GBK 字符集: GBK 标准里出现的所有需要进行编码的字符的集合。
GBK 字符编码: GBK 标准里的将这些字符按照某种映射规则映射成二进制数的编码标准。
2.具体例子:
GBK字符集中的2个字符:“A” 和 “一”
GBK字符编码:
“A”: 被编成二进制数 0x41
“一”: 被编成二进制数 0xB0 0xA1
3.小总结
字符集: 是 某个关于字符的标准 里出现的所有需要进行编码的字符的集合。
字符编码: 是 某个关于字符的标准 的将这些字符按照某种映射规则映射成二进制数的编码标准。
三、visual studio中的字符集设置(Unicode、多字节字符集)
有了上面简单的理解,下面来看一看visual studio的字符集设置到底是什么东西:
可以看到有Unicode字符集和多字节字符集两种选项(请看下图)。
这是两种字符集嘛?不,它们是字符集的两种分类,而不是某种具体的字符集。
1.为什么只有字符集设置,没有字符编码设置
为什么只有设置字符集,没有字符编码设置?其实是这样的,项目中使用了某种字符集,就认为你需要使用对应的字符编码来配合使用。
也就是说,在字符集设置里:
如果选了Unicode字符集,那么你处理字符的时候,需要使用Unicode字符集和能实现Unicode字符集的字符编码方式。
如果选了多字节字符集,那么你处理字符的时候,需要使用多字节字符集分类的字符集和能实现该字符集的字符编码方式。
简单来说就是字符集和字符编码要是匹配的,要看做是一起的。
举个例子:
如果选了Unicode字符集,那么我们处理的字符,得是Unicode字符集里有的字符,并且使用一种能够实现Unicode字符集的字符编码(比如utf-8字符编码)。
如果选了多字节字符集,那么我们处理的字符,得是多字节字符集分类中的一种字符集(比如GBK字符集)里有的字符,并且使用对应的字符编码方式(比如GBK字符编码)。
2.Unicode字符集
Unicode字符集是一种字符集,但是Unicode字符集标准里没有给出对应的字符编码方式。不过,在开发中为了能够使用上Unicode字符集,常用的实现Unicode字符集的字符编码有:utf-8、utf-16、utf-32等(常见是这几种)
(Unicode字符集是一种字符集,只是它有多种字符编码来实现)
(一般一种字符集只对应一种字符编码,比如GBK字符集只对应GBK字符编码,但Unicode字符集可以用utf-8、utf-16、utf-32等不同的字符编码来实现)
(所有如果觉得乱的话,不妨将Unicode字符集看作是字符集分类,尽管它事实上是一种字符集。)
当我们选择了Unicode字符集时,默认是使用utf-16字符编码,因为wchar_t是16位的
3.多字节字符集
多字节字符集就是真的可以看作一种字符集分类了。多字节字符集分类的字符集和字符编码有:GBK、Shift-JIS、Big5、EUC-JP、EUC-KR等。
当我们的系统使用的是GBK字符集,那么项目中就会默认使用GBK字符集和GBK字符编码。
也就是说,系统使用的默认字符集(ANSI),在vs项目里会被设置为多字节字符集,所以才说多字节字符集是一种字符集分类。