`
jayyanzhang2010
  • 浏览: 380262 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA中文编码和中文字符长度问题和解决方案

 
阅读更多

摘要:本文说明了Java对中文问题产生的原因,并给出了对中文问题的解决方案。同时引发出了对中英文混和的字符串的长度问题,并且给出解决方案的实现。

随着Java应用的增多,有关Java的中文问题也慢慢曝露出来。作为一个跨平台的网络编程语言,Java对于语言的处理,有自己独特的方法,但也随之带来了有些问题。

 

1、Java中文问题的产生
Java为了对全球的常用文字编码系统进行处理,采用了Unicode字符编码集。Unicode字符编码集是一种重要的交互和显示的通用字符编码标准,常见的有UTF-8、UTF-16、UCS-2、UCS-4等。国际标准组织为中文、日文和韩文字符(即CJK大字符集)对应的数据区间主要是4E00-9FFF,每一个字符对应惟一的一个编码。例如,“中文”这两个字对应的Unicode码分别是:0x4E2D、 0x6587。下面这段代码System.out.println((char)0x4E2D + "" + (char)0x6587 ) ;就可以打印出“中文”来。
我们通常使用的字符编码是一种双字节字符集(DBCS)。它与Unicode的编码机制有很大差别。Java语言的中文处理问题一般就是,如何将DBCS编码的字节串相互转换为正确的Unicode编码的字符串。所有中文问题的出现都是因为字节串没有被正确转换所至。

中文问题的出现一般都是在几种不同语言的操作系统中交互信息的时候出现的。

 

2、Java中文问题解决方案

首先,请确保你的JDK的版本是稳定的新版本,这是正确处理Java中文问题的前提条件。

 

2.1、其他内码和Unicode码之间的转换
解决问题的根源在于正确的处理各种内码和Unicode码进行相互转换。Java的String类提供了转换方法,具体用法是new String( byte[] , encoding ) ,即为用指定的字符编码方式转换指定的字节数组生成一个新的String。
比如:String abc = new String ( "hi...中文".getBytes( "GB2312" ) , "GB2312" ) ;

其中,"hi...中文".getBytes( "GB2312" )是按照GB2312的字符编码方式把该 String 转换成字节数组。然后再按照GB2312的方式生成一个abc的String对象。

 

2.2、让JDK用你指定的编码方式编译程序

在用javac编译程序时,编译器会用系统的默认编码来编译Java程序。用如下命令编译javac -encoding GB2312 Xxx.java,则是指定用GB2312的编码来进行编译。

 

2.3、JDBC中的中文问题
JDBC(Java DataBase Connectivity)是Java程序访问数据库的一个统一的接口。JDBC在网络传输过程中,大多数会采用本地编码格式来传输中文字符,例如中文字符“0x4175”会被转成“0x41”和“0x75”进行传输。因此需要对 JDBC返回的字符以及要发给JDBC的字符进行转换。当用JDBC向数据库中插入数据和查询数据时,则需要作编码转换。所以当应用程序访问数据时,在入口和出口处都要作编码转换。对于中文数据,数据库字符编码的设置应当保证数据的完整性,比如GB2312、GBK、UTF-8 等都是可选的数据库编码。
比如:转换成UTF-8进行传输
sqlstr1 = new String(sqlstr1.getBytes("GB2312")," "UTF-8");
转换成GB2312码进行显示

sqlstr2 = new String(sqlstr2.getBytes("UTF-8"),"GB2312");

 

3、Java中文编码失败情况说明

如果出现编码失败,在显示时会出现两种结果:“?”或者“□”。“?”表示转码错误;“□”表示转码失败。如果出现“?”,只有追本溯源查找问题所在才能解决问题;如果出现“□”,则表示可以在此基础上进一步进行转码操作直到成功。

 

4、Java中文编码带来的字符串长度问题
Java的中文问题处理系统除了在显示方面会出现问题外,还会对包含中文字符的字符串的长度的判断带来一定的问题。在C语言中,一个中文字符是2个字节,而在Java程序中,中文字符的长度是根据编码不同而不同的。下面的程序就可以看出问题所在。
测试程序如下,测试字符串为“中文abc”,测试平台为中文Win XP sp2。
public class ChineseCharacterTest
{
    public static void main( String [] args ) throws Exception
    {
        //按iso8859-1编码
        String iso = new String( "中文abc".getBytes( "GB2312" ) , "ISO8859-1" );
        //按GB2312编码
        String gb = new String( iso.getBytes( "ISO8859-1" ) , "gb2312" ) ;
        //按utf-8编码
        String utf_8 = new String( iso.getBytes( "ISO8859-1" ) , "UTF-8" ) ;
//下面分别打印出编码后的字符串和长度
        System.out.println( "iso is :" + iso + ", the length is:" + iso.length() ) ;
        System.out.println( "gb is :" + gb + ", the length is :" + gb.length() ) ;
        System.out.println( "utf-8 is:" + utf_8 + ", the length is :" + utf_8.length() ) ;
    }
}
用GB2312编码进行编译程序,其运行结果是:
iso is :????????abc, the length is:7
gb is :中文abc, the length is :5
utf-8 is:????????abc, the length is :7

可以看出,在ISO8859-1和UTF-8中一个中文字符按照2个长度单位处理,在GB编码中一个中文字符按照1个长度单位处理。这样在进行字符截取时就要相当注意这个问题。如果在ISO8859-1或UTF-8中一不小心将中文截去半个,将会出现致命的错误。

 

5、中文字符长度问题的解决方案
为了更好的解决中文字符的长度,我们设计并实现了下面的方法。基本思想是根据中文编码的编码区间,判断字符是否为中文字符,然后再作进一步的处理。
程序如下:
    public static int getChineseLength( String name , String endcoding )
            throws Exception{
        int len = 0 ; //定义返回的字符串长度
        int j = 0 ;
        //按照指定编码得到byte[]
        byte [] b_name = name.getBytes( endcoding ) ;
        while ( true ){
            short tmpst = (short) ( b_name[ j ] & 0xF0 ) ;
            if ( tmpst >= 0xB0 ){
                if ( tmpst < 0xC0 ){
                    j += 2 ;
                    len += 2 ;
                }
                else if ( ( tmpst == 0xC0 ) || ( tmpst == 0xD0 ) ){
                    j += 2 ;
                    len += 2 ;
                }
                else if ( tmpst == 0xE0 ){
                    j += 3 ;
                    len += 2 ;
                }
                else if ( tmpst == 0xF0 ){
                    short tmpst0 = (short) ( ( (short) b_name[ j ] ) & 0x0F ) ;
                    if ( tmpst0 == 0 ){
                        j += 4 ;
                        len += 2 ;
                    }
                    else if ( ( tmpst0 > 0 ) && ( tmpst0 < 12 ) ){
                        j += 5 ;
                        len += 2 ;
                    }
                    else if ( tmpst0 > 11 ){
                        j += 6 ;
                        len += 2 ;
                    }
                }
            }
            else{
                j += 1 ;
                len += 1 ;
            }
            if ( j > b_name.length - 1 ){
                break ;
            }
        }
        return len ;
    }

这个程序适合在中西文混和的情况下方便的得到字符串的长度,并且可以得到长度相同的字符串。

 

6、综述
综上所述,我们给出了Java中文问题的原因和解决方案,而且说明了关于Java中文字符处理带来的对字符串长度的影响,并给出了实际解决方案。实践证明,这种方法在各种项目工程中均很好的解决了各种问题,真正发挥出了Java跨平台的优点。

分享到:
评论

相关推荐

    java中截取带汉字的字符串

    ### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取...通过以上方法,我们可以在Java中有效地处理包含中文字符的字符串截取问题,避免出现乱码等情况。

    java Socket与C#通信中中文乱码问题的解决方案

    在Java和C#之间进行Socket通信时,遇到中文乱码问题主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C#在处理字符串时可能使用其他编码,如GBK或ASCII。为了解决这个问题,我们需要确保两端在发送和接收...

    关于java按字节截取带有汉字的字符串的解法

    在Java编程语言中,处理带有汉字的字符串时,由于汉字占据多个字节,按照字节进行截取可能会导致汉字被不完整地分割,从而产生乱码。为了解决这个问题,我们需要理解Unicode编码以及如何在Java中正确处理多字节字符...

    java字符集编码乱码详解

    ### Java字符集编码乱码详解 #### 一、编码与乱码基础知识 在计算机科学领域,字符集(Character Set)是指一系列符号和电子通信代码的标准集合。每种字符集都有其特定的应用场景和优势。例如,ASCII(American ...

    java字符编码问题

    本文将深入探讨Java中的字符编码问题,并提供一些实用的解决方案。 #### 二、Java中的字符编码基础 Java本身采用的是Unicode编码系统,这是一种国际化的编码标准,能够支持世界上几乎所有语言的文字表示。Java中的...

    Java Web编程中页面跳转乱码问题的解决方案.pdf

    GB2312编码是简体中文字符集的国家标准规范,支持21003个汉字和大量符号,采用双字节编码形式。 乱码问题分析与解决策略 页面跳转乱码问题的根本原因在于网络通信中字符集标准不一致,以及应用对国际化支持不完善。...

    Java WEB开发中的中文乱码问题解决方法.pdf

    然而,在Java Web开发中处理中文字符时,编码不一致常会导致乱码问题。 字符编码转换在Java Web应用开发中是不可或缺的一个过程。计算机只能识别二进制数,而字母、数字、汉字等通过字符编码转换成二进制形式存储。...

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

    ### 深入分析Java中的中文编码问题 #### 一、引言 在软件开发过程中,尤其是涉及到...通过对编码格式的理解、常见问题的分析以及合理的解决方案,可以有效地减少甚至避免中文乱码的问题,提高应用的质量和用户体验。

    Java中的中文编码问题

    本文旨在深入探讨Java中的中文编码问题,并提供解决方案,帮助开发者有效地处理这些问题。 #### 二、Java中常见编码格式及其区别 在深入探讨之前,我们需要了解一些基础概念,比如为什么需要进行编码,以及常见的...

    java中文乱码问题处理集锦

    本文将详细探讨Java中的字符编码原理,并提供几种解决中文乱码问题的方法。 #### 二、Java中的字符编码 ##### 2.1 字符与字节 Java的核心设计采用的是Unicode编码标准,这是为了确保能够正确地表示全球各种语言的...

    中英文字符转换解决乱码问题

    本文将深入探讨如何通过字符转换来解决常见的乱码问题,以及一个具体的Java代码示例,该示例展示了如何使用Base64编码来处理字节序列。 ### 中英文字符转换解决乱码问题 #### 1. 乱码问题根源 乱码通常发生在字符...

    Java Unicode 和字符集

    UTF-8(8-bit Unicode Transformation Format)是一种可变长度的字符编码,它使用1到4个字节来表示一个Unicode字符。这种编码方式的设计目的是为了兼容ASCII编码,因此对于ASCII字符集中的字符,UTF-8只需要使用一个...

    解决Java_Web开发中Jsp存储读取MySQL数据中文乱码的问题

    在Java Web开发过程中,特别是涉及到与数据库交互的应用中,中文乱码问题是一个常见且令人头疼的问题。这不仅影响用户体验,还可能造成数据丢失或误读。本文将详细介绍如何解决Java Web开发中,尤其是在使用Jsp存储...

    java字符集基础知识及问题

    此外,还将探讨Java中处理字符集的常见问题和解决方案。 首先,ISO8859-1是早期的单字节编码,主要用于英文字符,最多可表示256个字符。由于其简单性和与计算机基础单位的匹配,ISO8859-1在某些场景下仍然被广泛...

    Java的中文乱码及部分解决方法

    ### Java的中文乱码及部分解决方法 #### 引言 在Java开发过程中,中文乱码问题一直是开发者面临的一个挑战。这是因为Java内部采用Unicode编码,而...通过以上措施,可以有效地避免和解决Java开发中的中文乱码问题。

    截取如下字符串“java程序教程”的前5个字节,字符串应该为“java程”,截取前6个字符,字符串也应该为“java程”,程序实现之.

    这里需要注意的是,由于UTF-8编码可能造成字符串和字节数组的长度不一致,例如对于中文字符,“程”字在UTF-8编码下占用3个字节,因此如果截取长度不当时,最后一个字符可能无法形成一个完整的字符。 为了解决上述...

    统计字符串中英文标点数量并截取.zip

    这个压缩包内包含的可能是Java代码示例(如csdn-demo),用于批量处理字符串,统计其中的中英文标点符号的数量,并根据指定的字符编码(GBK或UTF)来计算字符串的总长度。如果字符串的总长度超过预设的最大长度,...

    java Web开发乱码解决方案

    ### Java Web 开发中的中文乱码问题及其解决方案 在Java Web开发过程中,中文乱码问题是一种常见的技术难题,尤其在处理客户端与服务器间的数据交互时更为突出。本文将详细介绍Java Web开发中出现乱码的原因,并...

    Java Web中请求消息和响应消息中文乱码问题的研究与对策.pdf

    Java Web开发中,中文乱码问题是一个常见的困扰,主要出现在请求消息和响应消息的编码与解码过程中。本文将深入探讨这一问题的原因、常见的字符编码类型以及对应的解决方案。 首先,出现乱码的原因在于字符编码的不...

Global site tag (gtag.js) - Google Analytics