`
k1280000
  • 浏览: 203763 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于JAVA中的编码解决

阅读更多

Java语言能够这么普遍的应用,与其国际化的能力是分不开的,国际化的编码是Java国际化中最重要的一个组成部分,Java的国际化编码能力与其使用Unicode编码是直接相关的。在Java中,任何字符类型的数据在Java程序中均以Unicode字符表示,比如char、String等类型。

注:本文实验环境为Windows XP中文版和JDK1.5。

一、getBytes()
当Java程序从输入流、文件或字符文字量等途径获得字符串时,均会做字符编码的转换,例如InputStreamReader的构造函数中就需要指定编码方式,而对于从文件和字符文字量中获得字符串时,均采用系统默认的编码方式对字符数据进行解码。考虑下面一段代码:

String str=”中”;


byte[] bytes = str.getBytes();


bytes = str.getBytes(“ISO-8859-1”);



语句①:将一个只含有一个字符“中”的字符串文字量赋给String类的一个对象str,字符文字量“中”是按照操作系统默认编码方式进行编码,在中文windows系统中通常是“GBK”,“中”在GBK编码中是0xD6D0,在将该字符赋给str时,Java会对该字符串进行编码转换,即将GBK编码方式的“中”转换成Unicode编码方式的“中”,Unicode编码方式“中”的编码是0x4E2D,所以str在程序运行期间在内存中的二进制表示成16进制就是0x4E2D。

语句②:获得str字符串的二进制形式。getBytes(String encoding)方法需要指定编码方式,表示获得该字符串在何种编码方式中的二进制形式。此语句中没有设置参数,表示采用操作系统默认的编码方式,即此处获得的bytes是“中”在GBK编码中的二进制形式,即bytes[0]=0xD6, bytes[1]=0xD0。

语句③:该语句与语句②的区别就是指定了编码方式,此处指定的是ISO-8859-1,即通常所说的Latin-1,该编码采用8bit对字符编码,所以编码空间中只有256个字符。该编码中只包含了基本的ASCII码和一些扩展的其它西欧字符,所以该字符集中不可能包含中文的“中”字,也就是说Java虚拟机无法在ISO-8859-1编码集中找到“中”字对应的编码,针对这种情况,就只返回一个问号(?,0x3f)字符,所以此时bytes.length只有1,且bytes[0]=0x3f。

二、new String(byte[] bytes, String encoding)
getBytes()方法从字符串获得二进制的字节数组。如果要从二进制的字节数组获得字符串,则就需要使用new String(byte[] bytes, String encoding)方法,该方法按照encoding编码方法对字节数组bytes中的二进制数组进行解析,生成一个新的字符串对象。

byte[] bytes = {(byte)0xD6, (byte)0xD0, (byte)0x31};


String str = new String(bytes);


str = new String(bytes,”ISO-8859-1”);



语句①:定义一个字节数组。


语句②:将该字节数组中的二进制数据按照默认的编码方式(GBK)编码成字符串,我们知道GBK中0xD6 0xD0表示“中”,0x31表示字符“1”(GBK兼容ASCII,但不兼容ISO-8859-1除ASCII之外的部分),所以str得到的值是“中1”。


语句③:该句用ISO-8859-1编码方式对该字节数据进行编码,由于在ISO-8859-1编码方式中一个字节会被解析成一个字符,所以该字节数组会被解释成包含三个字符的字符串,但由于在ISO-8859-1编码方式中没有对应0xD6和0xD0的字符,所以前两个字符会产生两个问号,由于0x31在ISO-8859-1编码中对应字符“1”(ISO-8859-1也兼容ASCII),所以此语句得到str的值是“??1”。


三、编码转换
上面介绍的两个语句是解决Java中编码问题的基本语句,而且一般的乱码问题也都可以通过配合使用以上两个语句来解决。以下以几种典型情况为例来解释编码转换问题:

1.             将InputStream中以UTF-8编码方式编码的字符数据转换成为GBK编码的字节数组

public byte[] Transmit(InputStream UTFIStream)

{

BufferedReader reader = new BufferedReader(new InputStreamReader(UTFIStream),”UTF-8”);

StringBuffer content = new StringBuffer();

String temline;

while((temline=reader.readLine()) != null)

{

   content.append(temline + “\n”);

}

分享到:
评论

相关推荐

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

    本文将深入探讨Java中的中文编码问题,以及如何有效地解决这些问题。 首先,我们要了解字符编码的基本概念。字符编码是用来表示文本的规则,比如ASCII、GB2312、GBK、UTF-8等。在中文环境下,最常用的是GBK和UTF-8...

    java判断编码方式

    在Java编程语言中,判断文件或字符串的编码方式是一个常见的需求。这主要涉及到字符集的概念,如ASCII、ISO-8859-1、UTF-8等,它们用于将二进制数据转换为人类可读的字符。在Java中,有多种方法可以用来识别或检测一...

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

    ### 深入分析Java中的中文编码问题 #### 一、引言 在软件开发过程中,尤其是涉及到国际化和多语言支持的应用中,编码问题一直是令开发者头疼的问题之一。尤其是在使用Java这种跨平台语言进行开发时,不同的操作...

    Java中文编码问题研究.pdf

    本文主要研究了Java中中文编码问题,探讨了Java SE序的运行原理,分析了Java单机程序、在服务器上运行JSP、Servlets或EJB等产生中文乱码的原因,并提出了相应的解决方案。 一、Java中文编码问题的来源 Java程序...

    JAVA安全编码规范参考.pdf

    总结而言,该JAVA安全编码规范参考文档为开发者在编写安全的Java代码时提供了一套全面的指导方针,从基本原则到具体漏洞的解决办法,都有详细说明。遵守这些安全编码规范,能有效减少系统漏洞,提高Java应用的安全性...

    JAVA中文编码的问题研究

    可以通过修改控制台设置或在Java程序中使用`System.setProperty("file.encoding", "UTF-8")`来设置Java默认编码。 6. 数据库编码 当Java程序连接数据库时,需要确保数据库的字符集与Java程序处理的编码一致。不匹配...

    Java 解决中文路径问题

    在Java编程中,处理中文...总之,解决Java中的中文路径问题需要理解字符编码的原理,并结合Java的API和系统特性进行适配。通过以上方法,可以有效地避免中文路径导致的错误,确保程序在处理中文文件路径时能正常运行。

    JAVA程序的编码格式详解

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

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

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

    java编码格式(对常见的java中文乱码作出分析及提出解决方案)

    Java编程中的中文乱码问题是一个常见但棘手的挑战,主要源于编码格式的不匹配和转换过程中的错误。本文深入探讨了这个问题,并提供了解决方案。 首先,我们要理解中文字符编码的历史背景。早期的计算机系统主要支持...

    java中文乱码解决之道(4)java编码转换过程Java

    在Java编程语言中,中文乱码问题是一个常见的挑战,特别...以上内容涵盖了Java编码转换的基本原理和处理乱码问题的关键点,希望对Java开发者有所帮助。在实际工作中,遇到具体问题时,还需结合实际情况进行分析和调试。

    java 文件编码转换

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

    java编码总结1

    【标题】:“Java编码总结1”主要涉及到Java编程语言中的编码问题,这在软件开发中是至关重要的。编码问题往往会导致程序出现难以预料的错误,尤其是处理多国语言或者特殊字符时。Java作为广泛使用的跨平台语言,其...

    java中编码的转换

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

    Java中的中文编码问题

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

    java编码主要用于java编码

    Java编码是程序开发的核心环节,主要涉及Java语言的语法、编程规范、最佳实践以及相关工具的使用。在Java编程中,我们遵循一定的规则和标准,以确保代码的可读性、可维护性和高效性。以下是对Java编码相关知识点的...

    关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    ### 关于JAVA字符编码:Unicode, ISO-8859-1, GBK, UTF-8 编码及相互转换 在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码...

    java文件编码GBK转utf8完美解决方案

    idea、Eclipse等项目导入.java文件中文乱码完美解决方案:文件夹下所有GBK编码的.java一键转为utf-8,操作方式:将GBK2UTF8.jar文件考到需要转码项目目录,在当前位置运行控制台,输入命令java -jar GBK2UTF8.jar,...

    编码规范 华为编码规范 JAVA 华为编码规范 JAVA

    《华为编码规范JAVA详解》 编码规范是软件开发中至关重要的一环,尤其对于大型企业如华为,一套统一、严谨的编码规范能确保代码的质量、可读性和可维护性。华为编码规范JAVA是华为公司为Java开发者制定的一套详细且...

Global site tag (gtag.js) - Google Analytics