java转换中文乱码_java中文乱码解决之道(四)-----java编码转换过程

前面三篇博客侧重介绍字符、编码问题,经过这三篇博客各位博友对各类字符编码有了一个初步的了解,要了解java的中文问题这是必需要了解的。可是了解这些仅仅只是一个开始,如下博客将侧重介绍java乱码是如何产生的、存在哪些乱码的状况、该如何从根本上解决乱码问题。各位随博主一块儿征服使人厌烦的java乱码问题吧!!!前端

java编码转换过程

咱们老是用一个java类文件和用户进行最直接的交互(输入、输出),这些交互内容包含的文字可能会包含中文。不管这些java类是与数据库交互,仍是与前端页面交互,他们的生命周期老是这样的:java

一、程序员在操做系统上经过编辑器编写程序代码而且以.java的格式保存操做系统中,这些文件咱们称之为源文件。程序员

二、经过JDK中的javac.exe编译这些源文件造成.class类。数据库

三、直接运行这些类或者部署在WEB容器中运行,获得输出结果。浏览器

这些过程是从宏观上面来观察的,了解这个确定是不行的,咱们须要真正来了解java是如何来编码和被解码的:编辑器

第一步:当咱们用编辑器编写java源文件,程序文件在保存时会采用操做系统默认的编码格式(通常咱们中文的操做系统采用的是GBK编码格式)造成一个.java文件。java源文件是采用操做系统默认支持的file.encoding编码格式保存的。下面代码能够查看系统的file.encoding参数值。编码

System.out.println(System.getProperty("file.encoding"));

第二步:当咱们使用javac.exe编译咱们的java文件时,JDK首先会确认它的编译参数encoding来肯定源代码字符集,若是咱们不指定该编译参数,JDK首先会获取操做系统默认的file.encoding参数,而后JDK就会把咱们编写的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。操作系统

第三步:JDK将上面编译好的且保存在内存中信息写入class文件中,造成.class文件。此时.class文件是Unicode编码的,也就是说咱们常见的.class文件中的内容不管是中文字符仍是英文字符,他们都已经转换为Unicode编码格式了。3d

在这一步中对对JSP源文件的处理方式有点儿不一样:WEB容器调用JSP编译器,JSP编译器首先会查看JSP文件是否设置了文件编码格式,若是没有设置则JSP编译器会调用调用JDK采用默认的编码方式将JSP文件转化为临时的servlet类,而后再编译为.class文件并保持到临时文件夹中。code

第四步:运行编译的类:在这里会存在一下几种状况

一、直接在console上运行。

二、JSP/Servlet类。

三、java类与数据库之间。

这三种状况每种状况的方式都会不一样,

1.Console上运行的类

这种状况下,JVM首先会把保存在操做系统中的class文件读入到内存中,这个时候内存中class文件编码格式为Unicode,而后JVM运行它。若是须要用户输入信息,则会采用file.encoding编码格式对用户输入的信息进行编码同时转换为Unicode编码格式保存到内存中。程序运行后,将产生的结果再转化为file.encoding格式返回给操做系统并输出到界面去。整个流程以下:

9460b858595eac249fbdd753d2c32e23.png

在上面整个流程中,凡是涉及的编码转换都不能出现错误,不然将会产生乱码。

2.Servlet类

因为JSP文件最终也会转换为servlet文件(只不过存储的位置不一样而已),因此这里咱们也将JSP文件归入其中。

当用户请求Servlet时,WEB容器会调用它的JVM来运行Servlet。首先JVM会把servlet的class加载到内存中去,内存中的servlet代码是Unicode编码格式的。而后JVM在内存中运行该Servlet,在运行过程当中若是须要接受从客户端传递过来的数据(如表单和URL传递的数据),则WEB容器会接受传入的数据,在接收过程当中若是程序设定了传入参数的的编码则采用设定的编码格式,若是没有设置则采用默认的ISO-8859-1编码格式,接收的数据后JVM会将这些数据进行编码格式转换为Unicode而且存入到内存中。运行Servlet后产生输出结果,同时这些输出结果的编码格式仍然为Unicode。紧接着WEB容器会将产生的Unicode编码格式的字符串直接发送置客户端,若是程序指定了输出时的编码格式,则按照指定的编码格式输出到浏览器,不然采用默认的ISO-8859-1编码格式。整个过程流程图以下:

b9fb451d7fc4810c19307524ac1035f7.png

3.数据库部分

咱们知道java程序与数据库的链接都是经过JDBC驱动程序来链接的,而JDBC驱动程序默认的是ISO-8859-1编码格式的,也就是说咱们经过java程序向数据库传递数据时,JDBC首先会将Unicode编码格式的数据转换为ISO-8859-1的编码格式,而后在存储在数据库中,即在数据库保存数据时,默认格式为ISO-8859-1。

2e9c8796a142f3cad66f6bd0072ff88a.png

,请尊重做者辛勤劳动成果,转载说明出处.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值