字符乱码之字符集和字符编码

Posted spring-rain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符乱码之字符集和字符编码相关的知识,希望对你有一定的参考价值。

最近经常会碰到上传客户提供的历史数据上传时csv文件用Excel打开时会有乱码问题,虽然知道知道是字符编码不一致导致的,但其中诸多细节却知之甚少,今日特来理理。

1.为什么会有字符乱码问题?如何解决字符乱码问题

计算机中存储的信息都是二进制数表示的,但是世界上有各种不同的语言文字,所以我们需要一些规则将各种字符转换成二进制后存储在计算机中 即编码,以及如果将存储在计算机中的二进制数解析出来即解码。就如破译电报密码一样如果密码本是错误的,那么密码也是错误。会有字符乱码问题就是因为解码方式是不对的,要解决乱码问题一定要知道字符编码是什么

扫盲知识点:

字符集(Charset):是一个系统支持的所有抽象字符的集合,字符是各种文字和符号的总称,包括各种国家文字,标点符号,图形符号,数字

字库表:它存储了编码规范中的所有字符,计算机通过计算机就是根据二进制数从字库表中找到字符然后显示给用户滴,相当于一个存储字符的数据库

字符集和字库表一一对应,相互转换,这是电脑识别字符的关键

 

字符编码(Charater Encoding):是一套法则,使字符集中的自然语言字符(字符集)转换成计算集可以接受的数字代码。

字符解码:二进制数从字库表中找到字符然后显示给用户

 

字符集和字符编码的关系:

字符集其实是一套编码规范中的子概念,为了显示字符,世界组织就制定了编码规范,使用不同的二进制数来表示代表不同的字符,这样电脑就可以根据二进制数来显示其对应的字符。我们通常用编码规范的名字来称呼对应的字符集

 

2.有哪些常见的字符编码?

一个字节(Byte)有8位(bit), 一个字符在不同的编码中所占的字节是不一定的,比如一个汉字在GBK编码中占两个字节,但是在UTGF-8 中占3个字节

技术图片

 

3.Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language

在HTTP中,与字符集和字符编码相关的消息头是Accept-Charset/Content-Type,另外主区区分Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language:
Accept-Charset:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案);
Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);
Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;
Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。例如:Content-Type: text/html; charset=’gb2312’
Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip
Content-Language:WEB服务器告诉浏览器自己响应的对象的语言。

 

 

抄录总结自:https://blog.csdn.net/qq_42068856/article/details/83792174

https://blog.csdn.net/xuebing1995/article/details/78714540

https://www.cnblogs.com/happyday56/p/4135845.html

 

以上是关于字符乱码之字符集和字符编码的主要内容,如果未能解决你的问题,请参考以下文章

十分钟搞清字符集和字符编码

小师妹学JavaIO之:文件编码和字符集Unicode

小师妹学JavaIO之:文件编码和字符集Unicode

(20161010)关于网页乱码和字符编码方式

MySQL对JSON类型UTF-8编码导致中文乱码探讨

Python3之字符编码