`
tiantianfei
  • 浏览: 39540 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

深入剖析JAVA编程中的中文问题

阅读更多
JAVA中文编码问题
先介绍一个概念:本地编码,所谓本地编码是操作系统采用的中文编码格式,一般是“GBK”或“GB2312”,可以用System.getProperty("file.encoding")。

本文从以下几个方面来对JAVA中的中文编码进行说明。
1.中文存储方式
2.编码变换问题
3.解决方法

第一:中文存储方式
本部分分控制台应用,WEB应用来分析:
对控制台应用:
JAVA文件--->CLASS文件---->虚拟机- - - >控制台输出
本地编码     UTF-8         UTF-8       本地编码
编辑源文件并保存,中文以本地编码方式保存, 利用javac编译后中文以UTF-8方式存在与类文件中,程序运行时,中文也是以UTF-8的格式存在,进行相关处理后,在控制台输出时,再从UTF-8转换为本地编码显示在控制台上.

对WEB应用:
JSP文件--->临时Servlet文件--->Servlet类文件--->虚拟机
本地编码 本地编码(缺省) UTF-8 UTF-8

WEB应用中客户端与服务器数据交互:
客户端---->传递---->服务器---->传递---->GBK
GBK ISO-8859-1 GBK ISO-8859-1 GBK
用户在表单中输入汉字时,编码格式肯定是本地编码,在发送之前IE把中文转换成ISO-8859-1,再发送到服务器,服务器接收到ISO-8859-1格式码流后,再变换成本地编码,服务器进行处理后,如果返回到客户端的是中文,也需要先变换成ISO-8859-1,然后再传递到客户端,客户端再用本地编码进行解释并显示。

数据库应用:
JAVA文件--->CLASS文件---->虚拟机- - - >传递
本地编码 UTF-8 UTF-8 本地编码
缺省在程序与数据库之间传递数据是以ISO-8859-1方式,JDBC首先把UNICODE格式的串转化为ISO-8859-1,然后传递到数据库,数据库进行处理后,把GBK编码的中文首先编码成ISO-8859-1再返回到客户端。

第二:编码变换问题
中文(不管是GBK还是GB2312),英文(ISO-8859-1),UTF-8三种不同的字符集之间存在映射表,通过映射表可以实现彼此之间的转换。可以实现中文<->英文、中文->UTF-8、英文UTF-8之间的变换,中英文到UTF-8的转换主要是虚拟机实现的。变换的过程就是编码和解码的过程,比如从中文”世界“转换成UTF-8格式,”世界“的中文编码为0xCAC0BDE7,在类文件和虚拟机中的编码为0xE4B898E7958C,在中文与UTF-8的映射表中肯定存在这么一项,如果在程序中有如下代码:
1. String str = "世界";//在虚拟机中的形式为0xE4B898E7958C
2. byte[] buf = str.getBytes("GBK");//编码,从UTF-8为GBK,buf中存放的肯定是0xCAC0BDE7
3. System.out.println(str); //控制台输出
4. System.out.println(new String(buf)); //解码为中文”世界“并显示
5. buf = str.getBytes("ISO-8859-1"); //编码,从UTF-8到ISO-8859-1,此时出现问题
6. System.out.println(new String(buf)); //解码为中文,显示 ??,说明出现了编码错误
7. System.out.println(new String(buf, "ISO-8859-1")); //编码为ISO-8859-1,显示 ??,说明出现编码错误
第5行代码出现问题,因为目前内存中的UNICODE 0xE4B898E7958C是从GBK的0xCAC0BDE7转换过来的,如果编码成ISO-8859-1,在UTF-8<->ISO-8859-1的映射表中根本不存在该表目,所以在该行开始出现编码错误。如果显示的是??肯定是编码错误,如果是乱码,往往是显示问题。此时,无论如何也不能由buf中的数据再变换到正确的编码。

第三:解决方法
解决中文编码问题的大原则就是:编解码必须保持一致。
比如程序中第2行就是从UTF-8编码到中文(GBK),跟前面的从中文(GBK)解码为UTF-8保持一致。也就是先从0xCAC0BDE7到0xE4B898E7958C,然后在第2行,再由0xE4B898E7958C到0xCAC0BDE7,此时控制台可以正确显示中文。即便没有第2行代码,那么在控制台显示前,控制台会先完成虚拟机中的0xE4B898E7958C到0xCAC0BDE7的转换,再进行显示。
在WEB开发中,为避免中文问题,可考虑采用如下方法:
在Servlet的doGet和doPost方法中:
request.setCharacterEncoding("GB2312"); //设置输入编码格式
response.setContentType("text/html;charset=GB2312");//设置输出编码格式
在JSP中:
<%@page contentType="text/html;charset=GBK"%>
<%request.setCharacterEncoding("GBK");%>
在数据库编程时,要首先保证数据库使用的是中文编码、另外再需要时设置数据库连接的编码格式为中文。
只要你全面掌握了中文的源文件、类文件、虚拟机和传输过程中的编码格式,并牢记编解码一致的原则,相信你能解决所有的中文问题。

网友:忽略了java文件自身也是可以指定编码方式

网友:源文件的编码格式不能指定,只能用操作系统缺省的编码格式.当然在编译的时候可以用-encoding选项来指定类文件的中文编码格式.
分享到:
评论

相关推荐

    深入剖析Java 编程中的中文问题及建议最优解决方法

    ### 深入剖析Java编程中的中文问题及建议最优解决方法 #### 1. 中文问题的来源 在探讨Java编程中的中文问题之前,我们首先需要理解计算机编码的基本概念及其发展历史。计算机最初的设计是为了处理单字节字符编码,...

    深入剖析Java编程中的中文问题及建议最优解决方法.pdf

    Java编程中的中文问题主要源于字符编码的不匹配和转换过程中的错误。计算机早期主要使用单字节...通过理解和遵循这些最佳实践,开发者可以在Java编程中有效地避免和解决中文乱码问题,确保程序的稳定性和跨平台兼容性。

    java中Collection深入剖析

    本篇文章将深入剖析Java中的`Collection`框架,探讨其核心概念、主要接口及其实现类,以及在实际开发中如何有效地使用这些工具。 首先,我们来看`Collection`接口。它定义了集合的基本操作,如添加元素(`add()`)...

    深入剖析Java编程,掌握面试精华!

    在深入剖析Java编程的过程中,掌握面试精华至关重要。Java作为一种广泛使用的编程语言,其深度和广度都相当丰富,尤其在企业级应用开发中占据主导地位。面试时,面试官通常会从基础知识、核心概念、实战经验等多个...

    iava解惑,深入剖析java

    《深入剖析Java》一书旨在帮助Java开发者解决在编程过程中遇到的困惑,通过一系列精心设计的谜题,深入探讨Java语言的核心概念、语法特性和易错点。以下是对部分谜题的详细解析,以加深对Java的理解。 谜题1:奇数...

    深入剖析TOMCAT_高清中文_带完整章节目录多版本

    通过《深入剖析Tomcat》,无论是初学者还是有经验的开发者,都能获得对Tomcat全面而深入的理解,提升在Java Web开发中的技能和效率。书中两个版本的差异可能体现在对新特性的介绍、问题解决方案的更新或最佳实践的...

    小心String的陷阱——深入剖析Java中String的处理机制

    文章由天津工业大学软件工程专业的翁龙辉撰写,旨在深入剖析`String`在Java中的独特行为及其潜在的陷阱。下面我们将详细探讨这些陷阱及其背后的原理。 ### String的不可变性 `String`在Java中被设计为不可变对象,...

    Java编程规范深入剖析

    ### Java编程规范深入剖析 #### 1. 引言 - **目的**:本文档旨在为Java开发者提供一套详尽的编程规范,旨在确保代码的高效性和可靠性。这些规范基于安全可靠的软件工程原则制定,目的是使得代码易于理解、维护及...

    JAVA常见中文乱码问题解决方法

    Java编程语言在处理中文字符时可能会遇到乱码问题,这主要源于Java的源代码编码、JVM处理class文件以及不同操作系统、数据库系统之间的编码不一致。本文深入剖析了Java中文问题的根源,并提供了相应的解决方案。 一...

    深入剖析Tomcat+源码

    《深入剖析Tomcat》是一本专注于Java Web服务器Tomcat的深度解析资料,包含了对Tomcat源码的细致分析。此资料包提供了多个文件,包括"深入剖析Tomcat源码.rar","深入剖析tomcat.pdf",以及"apache-tomcat-7.0.32-...

    深入剖析JSP和Servlet对中文的处理过程

    在Java中,处理中文字符涉及到编码和解码的过程。JDK提供了多种与中文相关的字符编码,如ASCII、ISO8859-1、GB2312、GBK、UTF-8和GB18030。在实际编程中,GB2312(GBK)和ISO8859-1是最常见的编码格式。ISO8859-1...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    深入剖析Java抽象类与接口的神秘力量 - 探索编程世界的双极法则

    ### 深入剖析Java抽象类与接口的神秘力量 - 探索编程世界的双极法则 #### 第一章:抽象类的创世神话 —— 基础与实战 ##### 概念解析: 抽象类在Java编程语言中扮演着极其重要的角色。它可以被视为一种特殊类型的...

    深入Java虚拟机附源码

    《深入Java虚拟机》是一本深受Java开发者喜爱的著作,它详细解析了Java虚拟机(JVM)的工作原理,帮助读者理解并优化Java程序的运行效率。这本书的附带源码使得学习过程更加直观和实践导向,让读者有机会直接查看和...

    深入剖析Tomcat 中文版 .pdf

    根据提供的信息,“深入剖析Tomcat 中文版 .pdf”这一标题和描述暗示这是一份关于Apache Tomcat服务器软件深入分析的中文文档。由于提供的部分内容主要包含重复的资源下载链接,并未涉及具体的知识点,因此本解析将...

    《深入剖析 Tomcat》PDF版本下载.txt

    根据提供的文件信息,本文将对《深入剖析 Tomcat》这一资料进行详细的知识点解析。Tomcat作为一款开源的Servlet容器,被广泛应用于Java Web应用程序的部署与运行环境中。本资料旨在帮助读者深入了解Tomcat的工作原理...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    深入剖析java类的构造方式.txt

    ### 深入剖析Java类的构造方式 在Java编程语言中,类是构成程序的基本单位之一,而类的构造则是实现对象初始化的关键步骤。本文将深入探讨Java中类对象的构造方式,包括构造器(Constructor)的作用、静态与实例...

Global site tag (gtag.js) - Google Analytics