java中文乱码字符集

合集下载

java中文乱码以及转码

java中文乱码以及转码

java中⽂乱码以及转码查看此⽂章需要对字符集编码有⼀定的认识:任意门:⼀、字符串的内部表⽰?重点:字符串在java(指在JVM中、在内存中)中统⼀⽤unicode表⽰( 即utf-16 LE) , 下⾯解释:对于 String s = "你好哦!";如果源码⽂件(java⽂件)是GBK编码, 操作系统(windows)默认的环境编码为GBK,那么编译时, JVM将按照GBK编码将字节数组解析成字符(系统⽂件本质就是⼆进制流),然后将字符转换为unicode格式的字节数组,作为内部存储。

当打印这个字符串时,JVM 根据操作系统本地的语⾔环境,将unicode转换为GBK,然后操作系统将GBK格式的内容显⽰出来。

当源码⽂件是UTF-8, 我们需要通知编译器源码的格式,javac -encoding utf-8 ... , 编译时,JVM按照utf-8 解析成字符,然后转换为unicode格式的字节数组,所以不论源码⽂件是什么格式,同样的字符串,最后得到的unicode字节数组是完全⼀致的,显⽰的时候,也是转成GBK来显⽰(跟OS环境有关:OS表⽰操作系统)⼆、乱码如何产⽣?本质上都是由于字符串原本的编码格式与读取时解析⽤的编码格式不⼀致导致的。

例如:String s = "你好哦!";System.out.println( new String(s.getBytes(),"UTF-8")); //错误,因为getBytes()默认使⽤GBK编码,⽽解析时使⽤UTF-8编码,肯定出错。

其中 getBytes() 是将unicode 转换为操作系统默认的格式的字节数组,即"你好哦"的 GBK格式,new String (bytes, Charset) 中的charset 是指定读取 bytes 的⽅式,这⾥指定为UTF-8,即把bytes的内容当做UTF-8 格式对待。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策随着互联网的快速发展,Java Web项目越来越受到开发者的青睐。

但是在开发Java Web项目的过程中,中文乱码问题却是一个让人头痛的难题。

中文乱码问题不仅会影响用户体验,还会导致数据传输错误、展示异常等严重后果。

对于Java Web项目开发中的中文乱码问题,我们必须深入了解原因并采取有效的对策来解决。

一、中文乱码问题的原因1. 字符集不匹配中文乱码问题的主要原因之一是字符集不匹配。

在Java中,字符集通常指的是编码方式,常见的编码方式包括UTF-8、GBK、ISO-8859-1等。

如果前端网页使用UTF-8进行编码,而后端服务器端使用了GBK进行解码,那么就会导致中文乱码问题的出现。

2. 数据库编码不一致另一个导致中文乱码问题的原因是数据库编码不一致。

在数据库中存储的数据也需要使用特定的编码方式进行存储和读取,如果数据库的编码方式和Java代码或前端网页的编码方式不匹配,也会导致中文乱码问题。

3. 网络传输和解析问题在Java Web项目中,数据经常需要在前端和后端之间进行传输和解析。

如果在数据传输过程中,传输的数据编码方式与接收方的解析方式不一致,就会导致中文乱码问题的出现。

1. 统一字符集为了解决中文乱码问题,我们首先需要统一字符集。

一般来说,推荐在Java Web项目中使用UTF-8作为字符集的统一标准。

我们需要确保在前端网页、Java代码和数据库中都使用UTF-8进行编码和解码,这样能够有效地避免字符集不匹配导致的中文乱码问题。

在前端网页中,我们可以通过设置<meta charset="UTF-8">来指定页面的字符集为UTF-8。

在Java代码中,我们可以通过在代码中明确指定字符串的编码方式为UTF-8来避免乱码问题。

在数据库中,我们可以通过修改表的编码方式为UTF-8或者在连接数据库的时候指定编码方式为UTF-8来解决中文乱码问题。

java中几种常见字符集与乱码介绍

java中几种常见字符集与乱码介绍

java中⼏种常见字符集与乱码介绍1. ASCII和Ansi编码字符内码(charcter code)指的是⽤来代表字符的内码.读者在输⼊和存储⽂档时都要使⽤内码,内码分为单字节内码 -- Single-Byte character sets(SBCS),可以⽀持256个字符编码.双字节内码 -- Double-Byte character sets)(DBCS),可以⽀持65000个字符编码.前者即为ASCII编码,后者对应ANSI.⾄于简体中⽂编码GB2312,实际上它是ANSI的⼀个代码页9362.Unicode符号集正如上⼀节所说,世界上存在着多种编码⽅式,同⼀个⼆进制数字可以被解释成不同的符号。

因此,要想打开⼀个⽂本⽂件,就必须知道它的编码⽅式,否则⽤错误的编码⽅式解读,就会出现乱码。

为什么电⼦邮件常常出现乱码?就是因为发信⼈和收信⼈使⽤的编码⽅式不⼀样。

⽽Unicode就是这样⼀种编码:它包含了世界上所有的符号,并且每⼀个符号都是独⼀⽆⼆的。

⽐如,U+0639表⽰阿拉伯字母Ain,U+0041表⽰英语的⼤写字母A,U+4E25表⽰汉字“严”。

具体的符号对应表,可以查询,或Unicode是⼀个符号集(世界上所有符号的符号集),⽽不是⼀种新的编码⽅式。

但是正因为Unicode包含了所有的字符,⽽有些国家的字符⽤⼀个字节便可以表⽰,⽽有些国家的字符要⽤多个字节才能表⽰出来。

即产⽣了两个问题:第⼀,如果有两个字节的数据,那计算机怎么知道这两个字节是表⽰⼀个汉字呢?还是表⽰两个英⽂字母呢?第⼆,因为不同字符需要的存储长度不⼀样,那么如果Unicode规定⽤2个字节存储字符,那么英⽂字符存储时前⾯1个字节都是0,这就⼤⼤浪费了存储空间。

上⾯两个问题造成的结果是:1)出现了unicode的多种存储⽅式,也就是说有许多种不同的⼆进制格式,可以⽤来表⽰unicode。

2)unicode在很长⼀段时间内⽆法推⼴,直到互联⽹的出现。

java中文乱码

java中文乱码

乱码问题一直困扰着开发人员:下面对java的乱码问题做一个小结:一、编码的基础概念首先,要想解决java中文乱码问题就有必要了解一下什么是字符,字符集,编码的概念。

字符:是文字与符号的总称,包括文字、图形符号、数学符号等。

字符集:就是一组抽象字符的集合。

字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。

繁体汉字字符集、日文汉字字符集等等。

计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码:制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。

根据字符集内字符的多少,会确定用几个字节来编码。

每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。

通常所说的字符集大多是这个含义。

二、常用的编码方式其次,要想解决java中文乱码问题也得了解一下我们常用的编码方式:ASCII编码是目前计算机中用得最广泛的字符集及其编码。

ISO8859-1可以表示的是西欧语言。

看起来很单一为什么还在使用呢?,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO-8859-1编码来表示。

而且在很多协议上,默认使用该编码。

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。

通常我们所遇到过多UTF-8这是Unic ode编码的实现方式,请一定要加以区分。

GB2312字集是简体字集;BIG5字集是台湾繁体字集;GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号GB18030是国家制定的一个强制性大字集标准,它的推出使汉字集有了一个统一的标准。

Linux系统默认使用的是ISO -8859-1编码,Win32系统默认使用的是GB2312编码。

Java的内核和class文件是基于unicode三、常用的乱码解决方法统一系统的输入、输出和操作系统是解决乱码的基本方法,产生乱码的根本问题是字节与字符的转换过程中,你必须知道原来字节和转换后的字节的编码方式。

java字符集编码乱码详解

java字符集编码乱码详解

一.编码与乱码(01)---编码基础Unicode中文“艺”字:827A二进制的“艺”字编码:1000 0010 0111 1010UTF-8的中文编码规则:1110xxxx 10xxxxxx 10xxxxxxUTF-8的“艺”字编码:1110【1000】10【0010】【01】10【11】【1010】UTF-8的转码过程解析:8对应的1000被填入第一字节剩余的4位。

2对应的0010被填入第2字节剩余的前4位。

7对应的0111被拆开,前2位01被填入第2字节的后两位,后2位1被填入第3字节的前2位。

A对应的1010被填入第3字节的后4位。

UTF-8的最终编码结果:11101000---对应E8;10001001---对应89;10111010---对应BA。

所以最终的UTF-8编码就是%E8%89%BAUnicode到UTF-8的转换:Unicode的16进制编码<-->对应的2进制编码<-->UTF-8规范的2进制编码<-->UTF-8规范的16进制编码也就是说假如在Java的底层JVM,由于采用的是Unicode编码字符集,对“艺”字的编码是827A。

那么在网络传输的过程中,我们当然不能直接传输827A这个字符过去代表艺”这个汉字,而必须要转换成0,1这样的字节流,才能在网络中传输。

所以说UTF-8是一种为了方便网路传输,节省传输数量,而对Unicode的字符集的字符编号进行转换,从定长的2个字节(16进制)转换成1~3个的变长字节(2进制)表示的转换格式。

由于Unicode采用的是2个字节的编码方式,而UTF-8转换后可能是1~3个字节,所以同一个汉字,在Unicode中的编码和经UTF-8转换后的编码值肯定是不同的。

就好像艺字的Unicode编码是827A,经转换后的3个字节是E889BA。

所以说对于英文字符来说,采用UTF-8对Unicode编码转换后节省了一倍的传输成本(由定长的2个字节变长1个字节),但对于原本双字节的东亚字符来说,反而增加了成本,是原来的1.5倍。

java中文乱码常见解决方式

java中文乱码常见解决方式

java中⽂乱码常见解决⽅式说明项⽬出现中⽂乱码现象、常见编码解决⽅法如下。

项⽬乱码项⽬⼯作空间在 Windows -> Prefenrences -> General -> Workspace 中进⾏设置在创建项⽬⼯作空间的时候、优先设置编码,在该⼯作空间下创建的项⽬默认遵循⼯作框架配置项⽬编码在 Project -> Resource中设置创建项⽬的时候、设置编码,则项⽬下⽂件都将会和项⽬统⼀页⾯⽂件编码⽂件右键 Properties -> Resource⽂件头编码⽂件头⼀般是HTML、JSP标签头部添加编码JSP:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>HTML:添加在<head>标签⾥⾯<meta http-equiv="Content-Type" content="text/html; charset=utf-8">编辑器编码设置NotePad++编辑器打开⼀个⽂件时候乱码在 菜单 -> 格式记事本存储时,保存为UTF-8格式服务器乱码SpringMVC在web.xml添加<filter><description>字符集过滤器</description><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><description>字符集编码</description><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>Tomcat编码Tomcat 的 conf/server.conf设置编码、设置为:<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"URIEncoding="UTF-8"redirectPort="8443" />添加:URIEncoding="UTF-8" 属性请求响应编码设置请求、响应编码//设置获取请求的编码request.setCharacterEncoding("utf-8")//设置服务器端的编码response.setCharacterEncoding("utf-8");//通知浏览器服务器发送的数据格式response.setContentType("text/html;charset=utf-8");字符串编码String oldStr = "编码设置";String newStr = new String(oldStr.getBytes(), "UTF-8");System.out.println("UTF-8编码:" + newStr);JDBC 连接指定编码url=jdbc:mysql://127.0.0.1/database?characterEncoding=UTF-8数据库设置编码编码可选:mysql> set character_set_client=utf8;mysql> set character_set_connection=utf8;mysql> set character_set_database=utf8;mysql> set character_set_results=utf8;mysql> set character_set_server=utf8;mysql> set character_set_system=utf8;mysql> set collation_connection=utf8;mysql> set collation_database=utf8;mysql> set collation_server=utf8;数据库表设置编码创建表的时候、指定编码:DEFAULT CHARSET=UTF8;CREATE TABLE `type` (`id` int(10) unsigned NOT NULL auto_increment,`type_name` varchar(50) character set utf8 NOT NULL default '', PRIMARY KEY (`id`)) DEFAULT CHARSET=UTF8;补充如果出现乱码现象、可对应⽂章修改。

Java中文乱码的解决方案

Java中文乱码的解决方案jsp+Servlet的形式,在jsp页面向后台发送的请求里包含中文时,后台采用String name = request.getParameter("name")接收到的是乱码,我在网上找了很多资料,有网友说request.getParameter是默认采用ISO8859-1来编码的,必须进行转换:我总结了一下,解决中文乱码大概有以下几种方式:1、采用decode()方法.URLDecoder.decode(s)2、采用设置字符集的方式request.setCharacterEncoding("utf-8");3、在页面上定义charset的字符集<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><meta http-equiv="Content-Type" content="text/html; charset=utf-8">4、在web.xml文件里定义编码,同时在CoreFilter类里定义编码为utf-8<filter><filter-name>encodingFilter</filter-name><filter-class>com.demo.filter.CoreFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>5、在form表单里定义编码accept-charset="utf-8" onsubmit="document.charset='utf-8';"6、更改ContentTypes的值改变myeclipse里ContentTypes的值为utf-87、改变tomcat字符集通过改变server.xml文件里的字符集来接收中文8、采用转码的方式nameCode = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");补充:如果是Servlet向页面发送的数据中包含中文,可以采用如下方式解决:response.setContentType("text/html;charset=utf-8");。

java中文乱码解决方法

java中文乱码解决方法Java是一种强大的编程语言,它可以为不同的计算机平台提供稳定可靠的软件开发环境,它也在处理文本文件上有着独特的优势。

但在使用Java处理中文文件时,乱码就成为了一个重大问题,如果不能很好地处理乱码,会影响到Java应用软件的正常使用。

本文给出了3种常用的Java中文乱码解决方案,以帮助相关开发人员快速解决乱码问题。

首先,使用正确的字符集编码将文件保存为指定的编码格式,这可以有效防止中文乱码的出现。

首先,应确保将文本文件保存为国际标准字符集UNIX UTF-8编码。

这是一种任何平台及系统都能够正确执行的字符集,比如Windows系统可以使用ANSI编码,但是在Linux 中会出现乱码问题。

其次,在字符编码方面应尽量使用UTF-8,它可以支持多种字符集,可以为用户提供更丰富的文本文件内容。

此外,为了完全解决Java中文乱码问题,开发者可以利用相关的API来设置不同的编码格式。

例如,开发者可以使用System.setProperty()方法来指定程序的编码格式,即指定文件使用的字符集。

以下是一个简单的示例代码:System.setProperty(file.encoding UTF-8另外,Java还提供了更加强大的控制功能。

它可以为用户提供一种可以自行设置和识别字符集的文件编码类。

例如,使用InputStreamReader和OutputStreamWriter类,开发者可以指定输入和输出的字符集,以进行不同的输入和输出操作,从而得到更加准确的结果,避免出现乱码问题。

以下是一个使用InputStreamReader 和OutputStreamWriter设置字符集的简单示例:InputStreamReader isr = new InputStreamReader(inputStream, UTF-8OutputStreamWriter osw = newOutputStreamWriter(outputStream, UTF-8最后,用户还可以使用相关的第三方软件来解决Java中文乱码问题,这些软件专门设计用于解决文本文件字符集编码的问题,可以自动识别文件的编码格式,并将其转换成指定的编码格式。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策中文乱码问题是在Java Web项目开发中常见的一个问题,它会导致页面显示、数据库存储和数据传输等方面的中文字符出现乱码现象。

本文将介绍中文乱码问题的原因和解决方案。

一、中文乱码问题的原因1. 字符编码不一致:在Java Web项目开发中,中文字符编码常使用的是UTF-8编码,但有时候程序读取和处理中文字符时使用了其他的编码方式,如ISO-8859-1,导致字符编码不一致从而出现乱码问题。

2. 数据库字符集不一致:数据库的字符集设置错误,与Java程序读取和处理中文字符的编码不一致,导致数据存储和读取时出现乱码。

3. 数据库连接设置错误:在操作数据库时,未正确设置数据库连接的字符集,导致数据库存储和读取时出现乱码。

4. 网络传输问题:在数据传输过程中,可能由于网络环境或传输方式等原因导致中文字符乱码。

二、中文乱码问题的解决方案1. 设置响应和请求的字符编码:在Java Web项目中,可以通过设置响应和请求的字符编码来解决中文乱码问题。

在Servlet的doGet或doPost方法中,在读取和输出中文字符之前,使用request.setCharacterEncoding("UTF-8")来设置请求的字符编码,使用response.setContentType("text/html;charset=UTF-8")来设置响应的字符编码。

2. 设置数据库字符集:在数据库创建表或字段时,应设置正确的字符集,通常使用UTF-8字符集来存储中文字符。

在数据库连接时,设置连接的字符集,例如在连接MySQL 数据库时可以在URL中添加参数"?useUnicode=true&characterEncoding=UTF-8"来指定连接的字符集。

3. 使用正确的编码方式读取和处理中文字符:在Java程序中,读取和处理中文字符时应使用正确的编码方式,通常使用UTF-8编码。

java中解决中文乱码和介绍一个上传工具

●在web开发中的中文乱码问题解决方案1、字符集分为:请求字符集和响应字符集2、对于请求字符集处理解决方案,一般我们所使用的中文字符集为gbk,gb2312,big5等等,而国际化或基于web2.0之后,我们选择utf-8作为字符集。

所以要进行字符集的转化问题:●根据请求解析某一个请求参数名所对应值的中文问题:(1)将字符串转为字节数组,并将其字符集转换为标准ISO-8859-1,代码:String ntname = request.getParameter(“name”);//接收内容///字符集进行转换byte[] ntname = ntname.getBytes(“ISO-8859-1”);//将字符集ISO-8859-1转换为字节数组(2)将字节数组再转换为字符串,并将其字符集设置为UTF-8。

代码:String newNtname = new String(ntname,utf-8”); //将字节数组变成字符串,同时指定转换的编码为utf-8.(2)设置当前请求字符集解决中文乱码的问题:使用:HttpServletRequest对象中方法setCharacterEncoding("UTF-8");代码:request.setCharacterEncoding(“utf-8”);核心提示:此种解决方案仅适合于post请求,而get请求无法解决(3) 通过设置过滤器型servlet,解决所有请求字符集的过滤A、建立过滤型servlet。

步骤:a、创建实现filter接口类,并且覆写3个方法,比如代码:MyFilter implements Filter{public void init(FilterConfig config) throws ServletException{}public void doFilter(ServletRequest request , ServletResponse response , FilterChain chain) throws ServletException,IOException {}public void destroy(){}}b、配置web.xml文件,配置过滤型servlet。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java中文解决大全Abstract:本文深入分析了Java程序设计中Java编译器对java源文件和JVM对class类文件的编码/解码过程,通过此过程的解析透视出了Java编程中中文问题产生的根本原因,最后给出了建议的最优化的解决Java中文问题的方法。

1.中文问题的来源计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理。

随着计算机的发展,为了适应世界其它民族的语言(当然包括我们的汉字),人们提出了UNICODE编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目前,大多数国际性的软件内部均采用UNICODE编码,在软件运行时,它获得本地支持系统(多数时间是操作系统)默认支持的编码格式,然后再将软件内部的UNICODE转化为本地系统默认支持的格式显示出来。

Java的JDK和JVM即是如此,我这里说的JDK是指国际版的JDK,我们大多数程序员使用的是国际化的JDK版本,以下所有的JDK均指国际化的JDK版本。

我们的汉字是双字节编码语言,为了能让计算机处理中文,我们自己制定的gb2312、GBK、GBK2K等标准以适应计算机处理的需求。

所以,大部分的操作系统为了适应我们处理中文的需求,均定制有中文操作系统,它们采用的是GBK,GB2312编码格式以正确显示我们的汉字。

如:中文Win2K默认采用的是GBK编码显示,在中文WIN2k中保存文件时默认采用的保存文件的编码格式也是GBK的,即,所有在中文WIN2K中保存的文件它的内部编码默认均采用GBK编码,注意:GBK是在GB2312基础上扩充来的。

由于Java语言内部采用UNICODE编码,所以在JAVA程序运行时,就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转换过程有着一系列的步骤,如果其中任何一步出错,则显示出来的汉字就会出是乱码,这就是我们常见的JAVA中文问题。

同时,Java是一个跨平台的编程语言,也即我们编写的程序不仅能在中文windows上运行,也能在中文Linux等系统上运行,同时也要求能在英文等系统上运行(我们经常看到有人把在中文win2k上编写的JAVA程序,移植到英文Linux上运行)。

这种移植操作也会带来中文问题。

还有,有人使用英文的操作系统和英文的IE等浏览器,来运行带中文字符的程序和浏览中文网页,它们本身就不支持中文,也会带来中文问题。

几乎所有的浏览器默认在传递参数时都是以UTF-8编码格式来传递,而不是按中文编码传递,所以,传递中文参数时也会有问题,从而带来乱码现象。

总之,以上几个方面是JAVA中的中文问题的主要来源,我们把以上原因造成的程序不能正确运行而产生的问题称作:JAVA中文问题。

2.JAVA编码转换的详细过程我们常见的JAVA程序包括以下类别:*直接在console上运行的类(包括可视化界面的类)*JSP代码类(注:JSP是Servlets类的变型)*Servelets类*EJB类*其它不可以直接运行的支持类这些类文件中,都有可能含有中文字符串,并且我们常用前三类JAVA程序和用户直接交互,用于输出和输入字符,如:我们在JSP和Servlet中得到客户端送来的字符,这些字符也包括中文字符。

无论这些JAVA类的作用如何,这些JAVA程序的生命周期都是这样的:*编程人员在一定的操作系统上选择一个合适的编辑软件来实现源程序代码并以.java扩展名保存在操作系统中,例如我们在中文win2k中用记事本编辑一个java源程序;*编程人员用JDK中的javac.exe来编译这些源代码,形成.class类(JSP文件是由容器调用JDK来编译的);*直接运行这些类或将这些类布署到WEB容器中去运行,并输出结果。

那么,在这些过程中,JDK和JVM是如何将这些文件如何编码和解码并运行的呢?这里,我们以中文win2k操作系统为例说明JAVA类是如何来编码和被解码的。

第一步,我们在中文win2k中用编辑软件如记事本编写一个Java源程序文件(包括以上五类JAVA程序),程序文件在保存时默认采用了操作系统默认支持GBK编码格式(操作系统默认支持的格式为file.encoding 格式)形成了一个.java文件,也即,java程序在被编译前,我们的JAVA源程序文件是采用操作系统默认支持的file.encoding编码格式保存的,java源程序中含有中文信息字符和英文程序代码;要查看系统的file.encoding参数,可以用以下代码:public class ShowSystemDefaultEncoding {public static void main(String[] args) {String encoding = System.getProperty("file.encoding");System.out.println(encoding);}}第二步,我们用JDK的javac.exe文件编译我们的Java源程序,由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然后JDK 就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。

然后,javac把转换后的unicode格式的文件进行编译成.class类文件,此时.class文件是UNICODE编码的,它暂放在内存中,紧接着,JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文件。

对我们来说,我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件,它内部包含我们源程序中的中文字符串,只不过此时它己经由file.encoding格式转化为UNICODE 格式了。

这一步中,对于JSP源程序文件是不同的,对于JSP,这个过程是这样的:即WEB容器调用JSP编译器,JSP编译器先查看JSP文件中是否设置有文件编码格式,如果JSP文件中没有设置JSP文件的编码格式,则JSP编译器调用JDK先把JSP文件用JVM默认的字符编码格式(也即WEB容器所在的操作系统的默认的file.encoding)转化为临时的Servlet类,然后再把它编译成UNICODE格式的class类,并保存在临时文件夹中。

如:在中文win2k上,WEB容器就把JSP文件从GBK编码格式转化为UNICODE格式,然后编译成临时保存的Servlet类,以响应用户的请求。

第三步,运行第二步编译出来的类,分为三种情况:A、直接在console上运行的类B、EJB类和不可以直接运行的支持类(如JavaBean类)C、JSP代码和Servlet类D、JAVA程序和数据库之间下面我们分这四种情况来看。

a)直接在console上运行的类这种情况,运行该类首先需要JVM支持,即操作系统中必须安装有JRE。

运行过程是这样的:首先java 启动JVM,此时JVM读出操作系统中保存的class文件并把内容读入内存中,此时内存中为UNICODE格式的class类,然后JVM运行它,如果此时此类需要接收用户输入,则类会默认用file.encoding编码格式对用户输入的串进行编码并转化为unicode保存入内存(用户可以设置输入流的编码格式)。

程序运行后,产生的字符串(UNICODE编码的)再回交给JVM,最后JRE把此字符串再转化为file.encoding格式(用户可以设置输出流的编码格式)传递给操作系统显示接口并输出到界面上。

对于这种直接在console上运行的类,它的转化过程可用图1更加明确的表示出来:图1以上每一步的转化都需要正确的编码格式转化,才能最终不出现乱码现象。

b)EJB类和不可以直接运行的支持类(如JavaBean类)由于EJB类和不可以直接运行的支持类,它们一般不与用户直接交互输入和输出,它们常常与其它的类进行交互输入和输出,所以它们在第二步被编译后,就形成了内容是UNICODE编码的类保存在操作系统中了,以后只要它与其它的类之间的交互在参数传递过程中没有丢失,则它就会正确的运行。

这种EJB类和不可以直接运行的支持类, 它的转化过程可用图2更加明确的表示出来:图2c)JSP代码和Servlet类经过第二步后,JSP文件也被转化为Servlets类文件,只不过它不像标准的Servlets一校存在于classes 目录中,它存在于WEB容器的临时目录中,故这一步中我们也把它做为Servlets来看。

对于Servlets,客户端请求它时,WEB容器调用它的JVM来运行Servlet,首先,JVM把Servlet的class 类从系统中读出并装入内存中,内存中是以UNICODE编码的Servlet类的代码,然后JVM在内存中运行该Servlet类,如果Servlet在运行的过程中,需要接受从客户端传来的字符如:表单输入的值和URL中传入的值,此时如果程序中没有设定接受参数时采用的编码格式,则WEB容器会默认采用ISO-8859-1编码格式来接受传入的值并在JVM中转化为UNICODE格式的保存在WEB容器的内存中。

Servlet运行后生成输出,输出的字符串是UNICODE格式的,紧接着,容器将Servlet运行产生的UNICODE格式的串(如html语法,用户输出的串等)直接发送到客户端浏览器上并输出给用户,如果此时指定了发送时输出的编码格式,则按指定的编码格式输出到浏览器上,如果没有指定,则默认按ISO-8859-1编码发送到客户的浏览器上。

这种JSP代码和Servlet类,它的转化过程可用图3更加明确地表示出来:图3d)Java程序和数据库之间对于几乎所有数据库的JDBC驱动程序,默认的在JAVA程序和数据库之间传递数据都是以ISO-8859-1为默认编码格式的,所以,我们的程序在向数据库内存储包含中文的数据时,JDBC首先是把程序内部的UNICODE编码格式的数据转化为ISO-8859-1的格式,然后传递到数据库中,在数据库保存数据时,它默认即以ISO-8859-1保存,所以,这是为什么我们常常在数据库中读出的中文数据是乱码。

对于JAVA程序和数据库之间的数据传递,我们可以用图4清晰地表示出来图43.分析常见的JAVA中文问题几个必须清楚的原则首先,经过上面的详细分析,我们可以清晰地看到,任何JAVA程序的生命期中,其编码转换的关键过程是在于:最初编译成class文件的转码和最终向用户输出的转码过程。

相关文档
最新文档