前面三篇博客侧重介绍字符、编码问题,经过这三篇博客各位博友对各类字符编码有了一个初步的了解,要了解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格式返回给操做系统并输出到界面去。整个流程以下:

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

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编码格式。整个过程流程图以下:

3.数据库部分

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

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

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

  1. java处理中文字符_Java中文字符处理的四大迷题

    虽然计算机对英文字符的支持非常不错,我们也恨不得写的程序只会处理英文的数据,但是昨为中国人,无可避免地要处理一些中文字符.当很简单的一件事情,遇到了中文,一切就不同了!本文就会讲述实际生产环境中遇到的 ...

  2. c与java的中文乱码_Java 中文乱码问题总结

    由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问 题解决方法之后,结合作者的编程实践,我发现过去谈的许多方法都不能清晰地说明问题及解决问题,尤其是跨平台时的中文问题.于 ...

  3. java 特殊字符 乱码_Java中文乱码特殊字符解决方案

    Java中文乱码&特殊字符解决方案 相信很多朋友遇到过Java的乱码问题,最近我也在解决一个"使用文本生成图片过程中中文以及特殊字符乱码"的问题:花了我大量时间,Debug ...

  4. java 空格乱码_java 中文乱码以及空格乱码解决方案总结

    当使用response.write返回JSON数据到前端时,需要在前面加上这句 response.ContentType = "text/html;charset=gb2312"; ...

  5. java 奇数中文乱码_java web 乱码 整理

    众所周知 java 程序使用的是Unicode 编码字符集,是说java内存里面使用Unicode字符集操作文字,java内存外当然使用的是程序员自己制定的字符集,如果程序员没有指定字符集,那么会使用 ...

  6. java为什么全是乱码_java一切乱码的解释 以及源头

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 InputStreamReader in = new InputStreamReader(new FileInputStream("demo.t ...

  7. java process 乱码_Java常见乱码原理及解决方案

    String odsStr = "测试"; String newStr = new String(odsStr.getBytes("GBK"), "I ...

  8. java pinyin4j 官网_Java中文转汉语拼音类库pinyin4j使用示例

    pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字) pinyin4j官方网址:http://pinyin4j.sourceforge.net/ import java.util. ...

  9. java 如何忽略异常_java中如何解决异常

    原文 | dzone.com/articles/9-- 作者 | Thorben Janssen 翻译 | geekymv 无论你是初学者还是经验丰富的开发人员,对于你和你的团队来说,提高异常处理的能 ...

最新文章

  1. 无法访问D盘,执行页内操作时的错误
  2. Oracle11g_同义词
  3. android 调用js怎么获取返回值_js 函数
  4. 使用log4j监视和筛选应用程序日志到邮件
  5. scala hashmap_如何在Scala中将Hashmap转换为Map?
  6. pip 不是内部或外部命令 也不是可运行的程序_QT之程序打包发布
  7. Linux单独编译设备树,迅为IMX6Q开发板-非设备树内核-单独编译内核驱动
  8. Silverlight中的InkPresenter(可以保存、加载)
  9. 28.go fmt 与 gofmt
  10. 学习记录:由技术而产品,由产品而商务
  11. c语言病房管理系统,病房全数字呼叫系统-医疗病房管理系统智能呼叫对讲系统...
  12. macbook重装系统 选择方案_Mac重装系统教程(二):网络在线重装系统
  13. 不用计算机做客户画像,描绘客户画像(有电脑的同学可做,完成加平时分2分)...
  14. Generative Adversarial Networks in Computer Vision: A Survey and Taxonomy(计算机视觉中的GANs:综述与分类)
  15. 基于遗传算法优化的BP神经网络
  16. CNCC2020_胡振江_从芯片定制到语言定制:程序设计语言的系统化定制及其支撑环境
  17. 声源分离算法性能评估指标SIR、SDR、SAR
  18. GD32E230开发笔记-GD32E230外设SPI的初始化
  19. 学习Python编程的11个入门技巧
  20. 微信小程序页面间的数据传递和数据共享

热门文章

  1. 多少并发量算高并发_如何理解:程序、进程、线程、并发、并行、高并发?
  2. Windows 磁盘分区后如何再合并如何用Windows自带工具扩大某个分区
  3. 基于keras和深度学习的视频分类实战(附代码)
  4. CF/379/problem/C
  5. Deepin/Ubuntu上安装MySQL出现MySQL候选项路径/etc/mysql/mysql.cnf不存在
  6. kernel kworker debug
  7. [附源码]计算机毕业设计JAVA游戏账号交易平台
  8. SQLServer-日期-DATEDIFF 函数
  9. Web开发种色系搭配方案和常用颜色码
  10. soundPool播放音效没声音的解决办法并据此研究如何提高音效声音