`

Java编程中的编码问题(转)

 
阅读更多

编码方式的简介:
String序列化成byte数组或反序列化时需要选择正确的编码方式。如果编码方式不正确,就会得到一些0x3F的值。常用的字符编码方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。
ISO8859_1用来编码拉丁文,它由单字节(0-255)组成。
GB2312、GBK用来编码简体中文,它有单字节和双字节混合组成。最高位为1的字节和下一个字节构成一个汉字,最高位为0的字节是ASCII码。
UTF-8/UTF-16/UTF-32是国际标准UNICODE的编码方式。 用得最多的是UTF-8,主要是因为它在对拉丁文编码时节约空间。
UNICODE值 UTF-8编码

 

Java使用unicode编码方式,最大程度的实现了多语言的支持。但是由于一些具体的原因,我们还需要了解Java编程中的编码处理方式,否则还会出现乱码的情况,有些情况下这个问题还很普遍。要注意的地方有以下几点:
       
        1、本地文件编码与Java程序。

        用JDK 的javac命令编译.java文件时,如果不用-encoding参数指定.java文件的编码方式,则javac命令首先获得操作系统默认的编码格式 file.encoding(在程序中可以通过System.getProperty("file.encoding")得到这个默认值),把.java 文件从file.encoding编码格式转化为Unicode格式放在内存中,然后将Unicode格式转化为UTF-8格式,生成.class文件, 也就是这样一个编码转换过程:file.encoding—>Unicode—>UTF-8。当运行.class文件时,就将UTF -8格式的.class文件转化成Unicode格式读入内存,此时若需要用户输入,并且程序中没有指定输入字符串的编码格式,则系统会默认用 file.encoding格式将用户的输入转化成Unicode格式存入内存,在内存中运行后,若有字符需要输出,并且程序中也没指定输出的编码格式, 则系统会默认将需要输出的字符从Unicode转化成file.encoding格式进行输出。.class中的字符是这样一个编码转化过程:UTF-8 —> Unicode—> file.encoding;输入的字符是这样一个转化过程:file.encoding—> Unicode—> file.encoding。一般情况下,我们在某个平台下编辑.java文件,保存的时候是使用系统默认编码方式(file.encoding),编译 时转化为unicode,最后以UTF-8存储.class,当运行它并产生输出时,又会有个反向的转化过程,不会出现乱码。但是在我们以非默认 file.encoding方式保存.java文件时,或者在另外一个系统输出而这个系统的默认file.encoding又和前一个不同时,java会 进行错误的字符编码转换,就会产生乱码问题。要想达到我们的目的,我们必须将每一处的file.encoding特别指定。

例如:
import java.io.*;
public class Test{

public static void main(String[] args){
  try{
    //写字符时指定编码,javac会实现GBK -> unicode的转换,无论系统默认file.encoding
    BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out,"GBK"));
    out.write("请输入字符串:/n");
    out.flush();
    //读时指定输出编码,java会实现unicode -> GBK的转换,无论系统默认file.encoding
    BufferedReader in=new BufferedReader(new InputStreamReader(System.in,"GBK"));
    String s=in.readLine();
    out.write("您输入的字符串是:"+s);
    out.flush();
    in.close();
    out.close();
  }catch(Exception e){}
}
}
编译时用以下方式:
javac –encoding GBK Test.java。      //实现了与本地系统编码无关。
这样无论在中文系统下还是在英文系统下都能得到正确的结果。
不指定-encoding也可以,不过需要用JDK的native2ascii命令将Test.java中的字符转化成Unicode格式,具体方法如下:
native2ascii –encoding gbk Test.java Test1.java。    //Java判断其为unicode编码后不转换??
生成的Test1.java是我们需要的文件,将其改名为Test.java覆盖原Test.java即可。
       
       2、JSP和Servlet汉字处理。

       与.java程序有所不同,jsp程序是由web服务器编译执行的,具体过程是这样的:
     (1) web服务器编译jsp源文件时,搜索jsp文件中用<%@ page contentType="text/html;charset=Jsp-charset" %>或者<%@ page pageEncoding="Jsp-charset" %>指定的Jsp-charset,如果未指定,则取默认值,大多数web服务器的默认值是:ISO8859-1。
     (2)以Jsp-charset编码方式解释jsp文件中出现的字符,并将其转化成Unicode编码,再转化成UTF-8格式,存为.java文件,编译生成.class文件。
     (3)运行.class文件,在服务器内部以Unicode格式对字符进行运算处理。
     (4)将运行后的结果转化为Jsp-charset格式输出到浏览器,并告诉浏览器该页面编码格式为Jsp-charset,如果未指定Jsp-charset,则同样取默认值,大多数web服务器的默认值是:ISO8859-1。
     (5)浏览器收到结果,根据Jsp-charset自动选择对应的方式(
<meta http-equiv=content-type content="text/html; charset=gb2312">


)查看。如Jsp-charset为GBK,则浏览器自动以“简体中文”方式查看;如Jsp-charset为ISO8859-1,则浏览器自动以“西欧”方式查看。
看一段简单的jsp代码:
       <%
            out.println("汉语"); 
        %>
        “汉语”两个字的GBK编码为:0xBABAD3EF
         对应的Unicode编码为:       0x6C498BED
         用UTF-8表示为:                 0xE6B189E8AFAD。
当jsp源文件中指定Jsp-charset为GBK时,“汉语”的编码转化过程如下:
         jsp源文件中为:                   0xBABAD3EF
        .java和.class文件中为:        0xE6B189E8AFAD
         在内存中运行时为:             0x6C498BED
         输出到浏览器时为:             0xBABAD3EF
         浏览器根据Jsp-charset=GBK自动选择以“简体中文”方式查看结果,得到“汉语”的正确显示。当jsp 源文件指定Jsp-charset为ISO8859-1时,“汉语”两个字在jsp源文件中的编码0xBABAD3EF,被当作ISO8859-1格式处 理,由于ISO8859-1是单字节编码的,因此转化成Unicode格式就成了:0x00BA00BA00D300EF,用UTF-8表示为: 0xC2BAC2BAC393C3AF。编码转化过程如下:
         jsp源文件中为:                   0xBABAD3EF
        .java和.class文件中为:        0xC2BAC2BAC393C3AF
         在内存中运行时为:             0x00BA00BA00D300EF
         输出到浏览器时为:             0xBABAD3EF
         浏览器根据Jsp-charset=ISO8859-1自动选择用“西欧”方式查看结果,结果是0xBABAD3EF在ISO8859-1中对应的字符串 “ooó?”;如果手动改变浏览器的查看方式为“简体中文”,则能得到“汉语”的正确显示。当jsp源文件不指定Jsp-charset时,大多数服务器 默认Jsp-charset为ISO8859-1,转化过程和指定Jsp-charset为ISO8859-1相同。值得一提的是,把Jsp- charset指定为GBK和指定为ISO8859-1,只要浏览器以“简体中文”方式查看都能得到“汉语”的正确显示。这是因为在编译jsp源文件时, 是将字符编码格式从Jsp-charset转化成Unicode,当输出到浏览器时,又将Unicode转化成Jsp- charset,这两步是相互抵消的。有人可能会问:以上是将jsp源文件保存为GBK格式,如果将jsp源文件保存为其他格式,如UTF-8或是 ISO8859-1会是什么结果呢?其实过程原理是一样的,值得说明的是,普通的文本编辑器不能指定保存格式,当源文件中含有中文字符时它会自动保存为 GBK格式。有些高级IDE,如eclipse,能指定保存格式,但是当你将含有中文字符的jsp源文件保存为ISO8859-1时,它会提示你不能保 存,因为源文件中含有与ISO8859-1不兼容的字符,如果将含有中文的jsp源文件保存为UTF-8格式,则eclipse会自动将其中的中文字符转 化成Unicode,再转化成UTF-8格式保存,比如“汉语”保存为UTF-8格式为:0xE6B189E8AFAD。
         当jsp源文件指定Jsp-charset为UTF-8时,此时如果jsp源文件是GBK格式的,则无论怎样都得不到正确的显示,只有将jsp源文件保存 为UTF-8格式才能得到正确的结果,即一般必须正确指定jsp源文件的编码方式。某些情况下,比如实际是GBK,指定编码ISO8859-1也不会错。 UTF-8转化过程如下: 
         jsp源文件中为:               0xE6B189E8AFAD
        .java和.class文件中为:    0xE6B189E8AFAD
         在内存中运行时为:         0x6C498BED
         输出到浏览器时为:         0xE6B189E8AFAD
浏览器根据Jsp-charset=UTF-8自动选择用“Unicode(UTF-8)”方式查看结果,得到“汉语”的正确显示。
       
       3、HTML表单提交汉字处理。

       有一个基本的事实是表单中的字符通过http协议传给服务器,http无一例外的使用ISO8859-1为传输对象的编码方式。因此客户端通过表单提交的字符数据到达服务器的时候是ISO8859-1编码,需要把它使用.getBytes("ISO-8859 -1","file.encoding")进行显示的转换才能正确的显示出来。如:
     String username = new String (userLoginForm.getUsername().getBytes("ISO-8859 -1","gb2312");
       
       4、JDBC与数据库(以MySQL为例)汉字处理。
       在获得数据库连接的时候,需要指定以unicode方式处理字符,并且接收的字符是file.encoding编码的,即与jsp页面中的jsp-charset保持一致,或者.java文件的实际编码方式一致。如:
        DriverManager.getConnection("jdbc:mysql://localhost/webstore?useUnicode=true&
characterEncoding=gb2312","root", "");  
        在mysql数据里设置字符集为GB2312.
        create database webstore character set 'gb2312';
        
         create table `user` (
        `user_id` INTEGER(11) NOT NULL AUTO_INCREMENT,
        `user_name` VARCHAR(10) NOT NULL,
        `user_password` VARCHAR(10) NOT NULL,
        `user_level` INTEGER(1) NOT NULL,
         PRIMARY KEY (`user_id`)) CHARACTER SET 'gb2312';

分享到:
评论

相关推荐

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

    在Java编程中,中文编码问题是一个常见的挑战,尤其是在处理文本输入、输出以及网络通信时。本文将深入探讨Java中的中文编码问题,以及如何有效地解决这些问题。 首先,我们要了解字符编码的基本概念。字符编码是...

    Java文件编码转换源码

    在Java编程语言中,文件编码转换是一个常见的任务,特别是在处理多国语言或者处理不同系统间的文件传输时。本文将深入探讨如何使用Java实现文件编码的转换,主要关注GB2312、UTF-8这两种常见编码格式之间的转换。 ...

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

    本文旨在详细探讨Java中的中文编码问题,包括常见的编码格式、编码问题的根源以及如何在Java Web应用程序中妥善处理这些问题。 #### 二、Java中的编码问题概述 ##### 2.1 几种常见的编码格式 在讨论Java中的编码...

    java文件的编码转换

    在IT行业中,编码转换是一个常见的问题,特别是在处理不同来源或平台的文件时。...通过上述步骤,你可以编写一个简单的Java程序,有效地将GBK编码的Java源代码转换为UTF-8,从而解决因编码不匹配导致的导入项目问题。

    java_各种编码转换源代码

    在Java编程语言中,编码转换是一项重要的任务,特别是在处理不同来源的数据时,如读取文本文件、网络数据传输或数据库交互。本资源包含一个名为`CodeConvert.java`的源代码文件,它提供了对多种编码格式进行转换的...

    Java中文编码问题研究.pdf

    Java中文编码问题是Java程序中常见的问题,解决这个问题需要了解Java程序的运行原理和编码格式的转换。通过使用统一的编码格式、字符集转换和Java的internationalization支持,可以解决Java中文编码问题。

    关于java中的编码转换问题(解决乱码问题)

    在Java编程语言中,编码和转换是至关重要的概念,特别是在处理字符集和处理不同编码格式的数据时。乱码问题通常是由于编码不一致或不当转换导致的。以下将详细阐述Java中涉及编码转换的关键知识点。 一、概念 1. ...

    java中编码的转换

    在Java编程环境中,字符编码的转换与处理是一个常见的技术难点,尤其当涉及到中文或其它非ASCII字符时。本文将深入探讨在Java中处理字符编码,尤其是UTF-8和GBK编码的转换技巧,以及如何在不同的场景下(如JSP页面与...

    JAVA 转换字符编码工具

    在Java编程语言中,字符编码是一个非常重要的概念,特别是在处理文本数据时。字符编码决定了如何将字符转换为字节序列,以及如何从字节序列恢复字符。本篇将围绕"JAVA 转换字符编码工具"这个主题,深入探讨字符编码...

    java字符串编码转换

    因此,当你在Java程序中创建一个 `String` 对象时,它默认就是Unicode格式的。 然而,在实际的应用场景中,我们常常需要处理不同编码格式的数据,如GBK、GB2312等。这就需要进行编码转换。 #### 三、编码转换的...

    java 文件编码转换

    标题"java 文件编码转换"指的是使用Java来解决文件编码问题,而描述中提到的"提供一个jar包和一个java文件"则暗示了我们可以通过这两个文件实现这个功能。 首先,`chardet.jar`可能是一个字符集检测库,用于自动...

    JAVA程序的编码格式详解

    本文旨在深入探讨Java中的编码格式,帮助开发者更好地理解和解决在开发过程中遇到的编码问题。 #### 二、编码的基本概念 首先我们需要了解为什么需要编码。简单来说,计算机只能识别数字,为了能够让计算机正确地...

    java串口通讯 短信测试 comm编程 PDU编码 进制转换 AT命令

    KEIL中如何用虚拟串口调试串口程序.doc Message PDU编码规则.doc QHDQ-29DDDAD3A0.LOG SMSLib串口通信.doc 串口常用参数.doc 关于java使用javacomm20.doc 常见的进制转换方法.doc 浅谈Java串行端口技术协议.doc 短信...

    JAVA中文编码的问题研究

    Java 作为一门广泛使用的编程语言,在处理中文字符时,由于中文字符集的复杂性,可能会遇到编码问题。本文将深入探讨Java如何处理中文编码,以及在不同场景下可能出现的问题。 1. Java 字符编码基础 Java 采用...

    Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.pdf

    Java中的字符编码转换是编程实践中一个至关重要的概念,尤其是在处理多语言环境和跨平台交互时。Java通过统一采用UTF-16编码格式在JVM内部处理字符,简化了字符操作的复杂性。UTF-16是一种变长的Unicode编码,它可以...

    java 中文Unicode转换

    在Java编程语言中,Unicode编码是一种广泛使用的字符集,它包含了世界上几乎所有的文字,包括中文。Unicode使得在程序中处理不同语言的文本变得更加方便。本文将深入探讨如何在Java中进行中文字符到Unicode编码的...

    java字符集编码问题

    在Java编程中,字符集编码问题是一个常见且重要的议题。由于不同的系统、平台以及网络环境中可能存在多种字符编码格式,这导致了在处理文本数据时可能会遇到编码不一致的问题。本文旨在深入探讨与Java相关的字符集...

    Java中的中文编码问题

    - **默认编码错误**:许多Java应用程序默认使用操作系统默认的编码,但在多语言环境中,这往往是不合适的。 - **配置错误**:配置文件中的编码设置不正确也会导致问题。 - **浏览器和服务器端编码不匹配**:在Web...

Global site tag (gtag.js) - Google Analytics