3.1 几种常见的编码格式

  3.1.1 为什么要编码

  一个字节 byte只能表示0~255个符号,要表示更多的字符,需要编码。

  3.1.2 如何翻译

  ASCII码:有128个,用一个字节的低7位表示。

  ISO-8859-1,能表示256个,是单字节编码。

  GB2312: 双字节编码,

  GBK:是对GB2312的扩展,加入更多汉字,和GB2312兼容,BG2312编码的汉字可以用GBK来解码,不会乱码。

  GB18030:

UTF-16:Unicode(统一码),ISO创建的全新的超语言字典。Unicode是JAVA和XML基础。 注意: Unicode是编码,也就是码和汉字(或其他国家语言)的对应关系。但是具体如何把这些编码存储,则要采取不同的编码方式,比如UTF-16和UTF-8。UTF-16就用固定两个字节表示一个UNicode编码。因为是固定两个字节的长度,所以操作起来很简单,这也是JAVA以UTF-16作为字符的内存存储格式的原因。

UTF-8: UTF的缺点是浪费,因为很多字符用一个字节就够了,用不上两个字节。

UTF-8的编码规则:  如果一个字节最高位为0,XXX

            如果一个字节以11开头,XXX

                如果一个字节以10开头,XXX

3.2 在JAVA中需要编码的场景

     什么场合需要编码

  3.2.1 在I/O操作中存在的编码

    在字符到字节或从字节到字符的转换,而这种转换的场景主要是I/O.  I/O包括磁盘和网络两种I/O.

    Reader类是在JAVA IO读字符的父类,而inputstream类是读字节的父类,InputStreamReader类就是关联字节到字符的桥梁,字节到字符的转换,而对具体字节到字符的编码实现,它又委托StreamDecoder去做,解码过程中必须制定Charset,如果没有制定,则将使用本地环境中的默认字符集,如在中文环境中使用GBK。

package ioTest;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;public class decodeTest {public static void main(String[] args) {String file = "XXX.txt";String charset = "UTF-8";try {FileOutputStream outputStream = new FileOutputStream(file);try {OutputStreamWriter  writer = new OutputStreamWriter(outputStream, charset);try {writer.write("要保存的中文字符");} catch (IOException e) {// TODO Auto-generated catch block
                    e.printStackTrace();}} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch block
                e.printStackTrace();}} catch (FileNotFoundException e) {// TODO Auto-generated catch block
            e.printStackTrace();}finally{writer.close();}}
}

  3.2.2 在内存操作中编码

字节和字符转换:

String s = "lfdasjlfjasljfasfa";
byte[] b = s.getBytes("UTF-8");
String n = new String(b, "UTF-8");

byte[] 和 char[]之间编码和解码:

String string = "fsdfsd";
Charset chars = Charset.forName("UTF-9");
ByteBuffer byteBuffer = chars.encode(string);
CharBuffer charBuffer = chars.decode(byteBuffer);    

3.3 在JAVA中如何编码

  3.3.1 按照ISO-8859-1编码

  3.3.2 按照GB2312编码

  3.3.3 按照GBK编码

  3.3.4 按照UTF-16编码

  3.3.5 按照UTF-8编码

  3.3.6 编码UTF-8编码代码片段

  3.3.7 几种编码格式的比较

  GBK是对GB2312扩展,可以表示所有的汉字。

UTF-8比UTF-16更适合网络传输

3.4 在JAVA web中编解码

http请求过程中,存在编码的地方是:

前段发过啦来的URL, cookie,  Parameters。

    服务器接收到HTTP请求后,要解析HTTP,其中URL,cookie和POST表单参数需要解码。

    服务器可能读网络和本地的文件和DB,可能存在编码问题。

    当servlet处理完所有请求后,需要将这些数据再编码,发送给浏览器。

   3.4.1 URL的编解码

    URL可能存在中文,所以需要编码。

    浏览器编码URL是将非ASCII字符按照某种编码格式编码成16进制数字后将每个16进制表示的字符前加上%。

    浏览器可以设置编码格式。

    Tomcat是如何解码的?

’URL的URI部分进行解码的字符集是在<Connector URIEncodeing="UTF-8">里设置的。

        QueryString的解析过程:GET方式HTTP请求的querystring和POST方式HTTP请求的表单参数都是作为parameters保存的,都通过request.getParameter();

                                      queryString的解码字符集是在哪定义的呢? 是在HTTP的header的contentType或者是默认的ISO-8859-1,如果要用HTTP的header中

                 中定义的编码需要设置<Connector URIEncoding="UTF-8"      useBodyEncodingForURI='true'>

    

  3.4.2 HTTP Header的编解码

  除了上面的URL外,还可能在header中传递其他参数,如cookie,redirectPath等。这些用户设置的值也可能存在编码问题。

对Header的解码是在调用request.getHeader()时进行的。默认是按照ISO-8859-1,如果header中有非ASCII,会乱码。

如果要用header传递中文,可以传之前编码,然后解码:

    1、客户端
    method.addRequestHeader("hello",URLEncoder.encode("中文","UTF-8"));
    2、服务器
    value=URLDecoder.decode(value);

  3.4.3 POST表单的编解码

    POST表单提交的参数的解码是在第一次调用request.getParameter时发生的,与queryString不同,是通过HTTP的body传递的,当提交表单的时候,根据ContentType的charset编码格式对表单中填入的参数编码,然后提交到服务器,在服务器端也用contentType来解码。这个编码、解码的字符集使我们自己设置的。

注意一定要在第一次调request.getParameter方法之前就设置request.setCharacterEncoding(charset), 否则会乱码。

  3.4.4 HTTP BODY的编解码

response.setCharacterEcoding可以设置编码方式,覆盖request.getCharacterEncoding的值,并且通过contentType返回给客户端。浏览器根据content-Type解码;如果么有这个值,按照HTML中的charset来解码。

和JDBC的编码方式要一致。

3.5 在JS中的编码问题

  3.5.1 外部引入JS文件

如何js文件本身的编码和JS中使用的字符编码不一致,可能就有乱码。比如*.js文件是UTF-8,而页面是GBK,就会有乱码问题。

  3.5.2 JS的URL编码

  Ajax的http_request('get', url, ture)调用,URL在IE下用OS的默认编码,在Firefox下是UTF-8编码。

  JS有三个函数是和编码解码相关的。

JAVA是如何来解码的?JAVA端处理URL编码、解码有连个类:   分别是Java.net.URLEncoder和java.net.URLDecoder

  3.5.3 其他需要编码的地方

3.6 常见问题分析

  3.6.1 中文变成了看不懂的字符

    解码和编码用的字符集不一样,就会出现乱码。

  3.6.2 一个汉字变成一个问号

    ISO-8859-1遇到不认识的用3F表示,是问号。

  3.6.3 一个汉字变成两个问号

  3.6.4 一种不正常的正确编码

3.7 一种繁简转换的实现方式

3.8 总结

转载于:https://www.cnblogs.com/liufei1983/p/7384317.html

第三章 深入分析Java Web中的中文编码问题相关推荐

  1. 深入分析 Java Web 中的中文编码问题

    深入分析 Java Web 中的中文编码问题 背景: 编码问题一直困扰着程序开发人员,尤其是在 Java 中更加明显,因为 Java 是跨平台的语言,在不同平台的编码之间的切换较多.接下来将介绍 Ja ...

  2. Java Web中的中文编码问题分析

    一.为什么需要编码 在计算机中存储信息的最小单位是1个字节,即8bit,所以能标识的最大字符范围是0~255,而人类自然语言中例如汉语.日语要表示的符号太多,无法单纯用一个字节来完全表示,为了解决这个 ...

  3. Java Web中的中文编码

    Java Web开发中经常会遇到中文编码问题,那么为什么需要编码呢?因为人类需要表示的符号太多,无法用1个字节来表示,而计算机中存储信息最小单元为1个字节.所以必须指定char与byte之间的编码规则 ...

  4. java全文检索工具_全文检索工具elasticsearch:第三章: Java程序中的应用

    搭建模块 创建二个项目 gmall-list-service的appliction.properties: server.port=8073 spring.datasource.url=jdbc:my ...

  5. 全文检索工具elasticsearch:第三章: Java程序中的应用

    搭建模块 创建二个项目 gmall-list-service的appliction.properties: server.port=8073 spring.datasource.url=jdbc:my ...

  6. 深入分析Java Web技术内幕(修订版) 读书笔记

    第一章   深入web请求过程 1.发起HTTP链接在本质上就是建立一个Socket连接. 2.Linux发起HTTP请求命令: curl "www.baidu.com" (-i/ ...

  7. 深入分析Java Web技术内幕pdf

    下载地址:网盘下载 内容简介  · · · · · · <深入分析Java Web技术内幕(修订版)>新增了淘宝在无线端的应用实践,包括:CDN 动态加速.多终端化改造. 多终端Sessi ...

  8. 深入分析Java Web技术内幕读书笔记(二)浅析DNS域名解析过程

    上一篇文章<浅析Web请求过程>讲述的是如何发起HTTP请求,对于请求发起过程中很重要的一个步骤--DNS解析过程的描述是一带而过,本篇文章将跟着DNS解析过程来分析域名是如何解析的. 一 ...

  9. 深入分析Java Web技术内幕读书笔记(一)浅析Web请求过程

    随着Web技术的快速发展,互联网的网络架构已经从传统的C/S架构转变为B/S架构,B/S架构相较于传统的C/S架构,有诸多优点,例如:提供了统一的操作方式,简化了用户的学习成本:便捷的开发方式大大提高 ...

最新文章

  1. 阿里某员工:年终奖到手,再见996
  2. Python 程序打包 -- 使用pyinstaller
  3. 封头名义厚度如何圆整_压力容器封头厚度计算
  4. java mina unix client
  5. mcjava盗版联机_我的世界java版联机版
  6. php购票排位_PHP基于双向链表与排序操作实现的会员排名功能示例
  7. Python之数据分析(Numpy中读取与保存数据文件、将数据文件制成K线图)
  8. 机器人学中的状态估计 中文版_《机器人学中的状态估计》-05偏差,匹配和外点...
  9. 使用java9的uuid生成方式,让uuid生成速度提升一个档次
  10. 编译出错:self-encoder.context-me_method = ME_UMH;
  11. vue 动态背景图轮播
  12. 计算机二十四点游戏怎么玩,扑克牌二十四点怎么玩?扑克牌二十四点游戏规则介绍...
  13. 微擎系统BUG漏洞解决方法汇总(原创)
  14. android 电视 vob格式转换,佳佳VOB格式转换器将视频转换到手机格式的方法
  15. 进制转换--2进制转16进制
  16. 常用的网络协议以及使用场景
  17. stata画时间趋势图时横坐标标签太长重叠怎么办
  18. 计网实验七:应用层协议服务配置(DNS,HTTP,FTP)
  19. Open Graph 分享预览
  20. 教育培训行业如何做好私域运营

热门文章

  1. 1.5 编程基础之循环控制 10 满足条件的数累加
  2. 1.3编程基础之算术表达式与顺序执行 19 AXB问题
  3. angular linux 打包不成功_Angular Library 系列之 构建和打包
  4. RTX5 | 软件定时器01 - 创建一个软件定时器(单次运行)
  5. python函数参数学习_python函数学习1
  6. java中四类八中_JAVA中的八中基本数据类型
  7. Python笔记-房贷计算(本息和本金,每月还利息和每月还本金)及作图对比
  8. Java笔记-获取自己资源文件中的配置文件(打包成jar包为其他包所引用也能获取)
  9. MySQL工作笔记-检索出某一时间段中的数据,并更新
  10. Java工作笔记-IntelliJ IDEA中高效文件切换跳转