深入乱码
什么是字符集和字符编码?
字符:在计算机和电信技术中,一个字符是一个单位的字形、类字形单位或符号的基本信息。即一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号等。
字符集:多个字符的集合。例如GB2312是中国国家标准的简体中文字符集,GB2312收录简化汉字(6763个)及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。
字符编码:把字符集中的字符编码为(映射)指定集合中的某一对象(例如:比特模式、自然数序列、电脉冲),以便文本在计算机中存储和通过通信网络的传递。
**字符集和字符编码的关系 **
字符集是书写系统字母与符号的集合,而字符编码则是将字符映射为一特定的字节或字节序列,是一种规则。通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码(例如:ASCII、ISO-8859-1、GB2312、GBK都是即表示了字符集又表示了对应的字符编码,但Unicode不是,它采用现代的模型)),因此基本上可以将两者视为同义词。
为什么乱码是问号不是其他符号呢?
说道这里就跟编码的发展史是很有关系的了
最开始出现的是 ASCII码、是美国人发明的,他将因为字母和特殊符号全部编码进去、采用了一个字节256种情况去编码这些字符
后来欧洲人看美国人整了个编码 于是自己整了个ISO-8859-1,他是为了将欧洲所有国家的语言文字全部编码进去,采用了 2个字节 65536种情况去对ASCII进行拓展,拓展完成之后,发现在码表中出现了大量的空白。也就是说有码值但是没有对应的字符
后来中国人发明了GB2312,也采用了2个字节, 收录 6763 个汉字,
再后来GB2312 扩展成了GBK, 21886 个汉字和图形符号
但也出现了大量空白的情况、当我们在解码一个字符的时候,如果编码和解码不一致的话很有可能造成读取的码值在码表中没有对应的字符,所以就用?代替