1、为什么要编码

编码的原因可以总结为:
◎ 计算机中存储信息的最小单元是一个字节(byte),即8个bit,所以能表示的字符范围是0~255个。
◎ 人类要表示的符号太多,无法用一个字节来完全表示。
要解决这个矛盾必须要有一个新的数据结构char,从char到byte必须编码。

2、几种编码格式

1.ASCII码

学过计算机的人都知道ASCII码,总共有128个,用一个字节的低7位表示,0~31是控制字符如换行、回车、删除等,32~126是打印字符,可以通过键盘输入并且能够显示出来。

2.ISO-8859-1

128个字符显然是不够用的,于是ISO组织在ASCII码基础上又制定了一系列标准用来扩展ASCII编码,它们是ISO-8859-1~ISO-8859-15,其中ISO-8859-1涵盖了大多数西欧语言字符,所以应用得最广泛。ISO-8859-1仍然是单字节编码,它总共能表示256个字符。

3.GB2312

它的全称是《信息交换用汉字编码字符集基本集》,它是双字节编码,总的编码范围是A1~F7,其中从A1~A9是符号区,总共包含682个符号,从B0~F7是汉字区,包含6763个汉字。

4.GBK

全称叫《汉字内码扩展规范》,是国家技术监督局为Windows 95所制定的新的汉字内码规范,它的出现是为了扩展GB2312,加入更多的汉字,它的编码范围是8140~FEFE(去掉XX7F),总共有23940个码位,它能表示21003个汉字,它的编码是和GB2312兼容的,也就是说用GB2312编码的汉字可以用GBK来解码,并且不会有乱码。

5.GB18030

全称是《信息交换用汉字编码字符集》,是我国的强制标准,它可能是单字节、双字节或者四字节编码,它的编码与GB2312编码兼容,虽然是国家标准,但是实际应用系统中使用得并不广泛。

6.UTF-16

说到UTF必须提到Unicode(Universal Code统一码),ISO试图创建一个全新的超语言字典,世界上所有的语言都可以通过这本字典来相互翻译。可想而知这个字典是多么复杂,关于Unicode的详细规范可以参考相应文档。Unicode是Java和XML的基础,下面详细介绍Unicode在计算机中的存储形式。
UTF-16具体定义了Unicode字符在计算机中的存取方法。UTF-16用两个字节来表示Unicode转化格式,它是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是16个bit,所以叫UTF-16。UTF-16表示字符非常方便,每两个字节表示一个字符,这就大大简化了字符串操作,这也是Java以UTF-16作为内存的字符存储格式的一个很重要的原因。

7.UTF-8

UTF-16统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要用两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的情况下,这样会增大网络传输的流量,而且也没有必要。而UTF-8采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以由1~6个字节组成。
UTF-8有以下编码规则:
◎ 如果一个字节,最高位(第8位)为0,表示这是一个ASCII字符(00~7F)。可见,所有ASCII编码已经是UTF-8了。
◎ 如果一个字节,以11开头,连续的1的个数暗示这个字符的字节数,例如:110xxxxx代表它是双字节UTF-8字符的首字节。
◎ 如果一个字节,以10开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节。

3、两种编码场景

1.磁盘I/O

  • Reader 读字符
  • InputStream 读字节
  • 字节->字符:StreamDecoder解码
  • Writer 写字符
  • OutputStream 写字节的父类
  • 字符->字节:StreamEncoder编码

2.内存中编码

  • byte[] b = str.getBytes(“UTF-8”)
  • String s = new String(b, “UTF-8”)

4、Web请求中涉及的编解码:

1.URL的编解码(服务器端设置URIEncoding)

URL中有中文:

PathInfo -> UTF-8编码

QueryString –> GBK编码

为什么会有”%”:RFC3968知,浏览器编码URL将非ASCII字符编码成16进制数字后,每个16进制表示的字节前要加上”%”

2.HTTP Header的编解码

不要在Header中传递非ASCII字符(默认ISO-8859-1解码)

3.POST表单编解码

设置request.setCharacterEncoding(charset)

4.HTTP Body编解码

设置Content-Type为”UTF-8”

5.其他涉及编码

JS文件引入(URL编码escape()/encodeURI)

Xml文件设置头部

Velocity/Jsp设置编码

6、几种乱码问题分析

1.中文变成了看不懂的字码

char[] ---GBK编码--> byte[] ---ISO-8859-1解码---> i^o&i^i

2.一个汉字->一个问号

char[] ---GBK编码--> byte[] ---ISO-8859-1解码--->char[] (?)

3.一个汉字->两个问号

char[] ---ISO-8859-1编码--> byte[] ---ISO-8859-1解码--->char[] ---GBK编码--> byte[] ---GBK解码--->char[] (??)

4.不正常的正确编码

char[] ---GBK编码--> byte[] ---ISO-8859-1解码--->char[] ---ISO-8859-1编码--> byte[] ---GBK解码--->char[]

5.解决:

(1)、明确转码位置(数据->磁盘/传输)

(2)、框架、系统、软件、操作系统设置正确编码(明确默认编码)

参考:

《深入分析Java Web技术内幕》

中文编码问题分析及几种乱码场景相关推荐

  1. Synchronized 的 8 种使用场景!

    blog.csdn.net/x541211190/article/details/106272922 简介 本文将介绍8种同步方法的访问场景,我们来看看这8种情况下,多线程访问同步方法是否还是线程安全 ...

  2. 应用Quick BI实现首购用户和用户首购的三种运营场景监控

    导读: 首购用户和用户首购是互联网公司运营中最简单.最常遇到.也最容易混淆的两个概念.运营人员与BI经常在首购用户和用户首购上沟通不畅,信息不对称造成理解偏差,导致数据仓库模型或者BI仪表板一改再改. ...

  3. 用户留存分析的几种方法

    来源:数据分析不是个事儿 之前跟大家讲过同期群分析: 同期群本质上是留存分析的一种实现方式,对于用户分析有很大的价值,今天再给大家分享几个相关的分析视角. 进入互联网下半场后,互联网流量竞争愈发激烈, ...

  4. 聊聊并发编程的12种业务场景

    前言 并发编程是一项非常重要的技术,无论在面试,还是工作中出现的频率非常高. 并发编程说白了就是多线程编程,但多线程一定比单线程效率更高? 答:不一定,要看具体业务场景. 毕竟如果使用了多线程,那么线 ...

  5. 8种应用场景!嵌入式BI如何快速提升SaaS数据分析功能

    新一代信息技术的突飞猛进,给我们的工作方式带来了前所未有改变.与时俱进,拥抱数字化,远程办公正被越来越多的企业所热捧,成为当下最受欢迎的一种工作模式.而远程办公仅仅是SaaS应用的冰山一角而已.Saa ...

  6. 情感分析 | 细粒度情感分析在美团到餐场景中的应用

    每天给你送来NLP技术干货! 来自:美团技术团队 经典的细粒度情感分析(ABSA,Aspect-based Sentiment Analysis)主要包含三个子任务,分别为属性抽取.观点抽取以及属性- ...

  7. 一种公路场景下基于视觉的车辆检测和计数系统

    1 文章信息 本次介绍的是题目为<Vision-based vehicle detection and counting system using deep learning in highwa ...

  8. R语言Welch方差分析(Welch’s ANOVA)实战:Welch方差分析是典型的单因素方差分析的一种替代方法,当方差相等的假设被违反时我们无法使用单因素方差分析,这时候Welch’s出来救场了

    R语言Welch方差分析(Welch's ANOVA)实战:Welch方差分析是典型的单因素方差分析的一种替代方法,当方差相等的假设被违反时我们无法使用单因素方差分析,这时候Welch's出来救场了 ...

  9. java get请求传参_Java-ThreadLocal三种使用场景

    ThreadLocal对于每一位Java读者而言我想可能都不陌生,因为面试基本都会被问到. Java-ThreadLocal三种使用场景 关于ThreadLocal JDK1.2的版本中就提供java ...

最新文章

  1. 总结android项目的基本开发步骤(转帖)
  2. nyoj 284 坦克大战 (优先队列)
  3. Python实现微信消息防撤回
  4. ASP.NET Razor (标记)语言概要
  5. 饮冰三年-人工智能-Python-29瀑布流
  6. 五分钟了解先验概率和后验概率
  7. 交大c语言作业答案,西安交大c语言作业及答案详解.docx
  8. 分类与数值预测是预测问题的两种主要类型
  9. F. Cowmpany Cowmpensation(树形dp + 拉格朗日插值)
  10. qr码是二维码码_如何使用QR码进行有效的营销和推广
  11. linux 中的时间戳功能,Linux中时间戳取证研究
  12. C#使用Windows Service
  13. 【全文干货】python—函数详解(值得收藏的学习手册)
  14. 无线条码仓库管理系统
  15. PN结的形成及其单向导电性
  16. 计算机没有鼠标用英语怎么说,鼠标用英语怎么说
  17. 运动世界校园显示服务器异常,运动世界校园跑完是异常成绩,计入有效成绩里吗?...
  18. 微软服务器工程师认证,微软认证的系统工程师(MCSE)
  19. yeahnet邮箱服务器,网易126/163/Yeah.net免费邮箱开放IMAP服务
  20. 用闭包写法优化laravel多条件查询

热门文章

  1. 使用auto.js模拟手动点击芭芭农场任务(芭芭农场自动脚本2022.8.1更新)
  2. 【设计模式】观察者模式
  3. 如何配置EditPlus放大、缩小字体的快捷键
  4. 快递取件码生成软件_一种快递柜取件码生成装置及其使用方法与流程
  5. 注塑行业MES实施方案
  6. 如何科学管理你的密码
  7. 网站开发-php开发手机论坛(11)-用户中心
  8. 西游记中四大菩萨的坐骑
  9. 定值保险计算举例_保险中生命表的计算例题 定值保险和不定值保险计算例题...
  10. Prometheus简介和安装