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

Java GetBytes 编码方式(转)

阅读更多

      在JAVA源文件-->JAVAC-->Class-->Java-->getBytes()-->new String()-->显示的过程中,每一步都有编码的转换过程,这个过程总是存在的,只是有的时候用默认的参数进行。

      1.  JAVAC是以系统默认编码读入源文件,然后按UNICODE进行编码的。可以通过指定编码方式改变Javac读入源文件的编码方式。

 

Java代码  收藏代码
  1. javac -encoding GBK Test.java  

 

      2. 在JAVA运行的时候,JAVA也是采用UNICODE编码的,并且默认输入和输出的都是操作系统的默认编码。

      也就是说在new String(bytes[,encode])中,系统认为输入的是编码为encode的字节流,换句话说,如果按encode来翻译bytes才能得到正确的结果,这个结果最后要在JAVA中保存,它还是要从这个encode转换成Unicode,也就是说有bytes-->encode字符-->Unicode字符的转换;而在String.getBytes([encode])中,系统要做一个Unicode字符-->encode字符-->bytes的转换。

3. Java中的编码支持

Java是支持多国编码的,在Java中,字符都是以Unicode进行存储的,比如,“你”字的Unicode编码是“4f60”,我们可以通过下面的实验代码来验证: 

Java代码  收藏代码
  1. class TestCharset          {  
  2.             public static void main(String[] args)  
  3.             {  
  4.             char c = '你';  
  5.             int i = c;  
  6.             System.out.println(c);  
  7.             System.out.println(i);  
  8.             }  
  9.     }   

 不管你在任何平台上执行,都会有相同的输出:20320,20320就是Unicode “4f60”的整数值。其实,你可以反编译上面的类,可以发现在生成的.class文件中字符“你”(或者其它任何中文字串)本身就是以Unicode编码进行存储的:char c = '\u4F60';
     4. 为了避免这种问题,建议大家都在编码中使用String.getBytes(String charset)方法。

Java代码  收藏代码
  1. class TestCharset {  
  2.     public static void main(String[] args) {  
  3.         new TestCharset().execute();  
  4.     }  
  5.   
  6.     private void execute() {  
  7.             String s = "Hello!你好!";  
  8.             byte[] bytesISO8859 =null;  
  9.             byte[] bytesGBK = null;  
  10.             try  
  11.             {  
  12.             bytesISO8859 =  
  13.             s.getBytes("iso-8859-1");  
  14.             bytesGBK = s.getBytes("GBK");  
  15.             }  
  16.             catch  
  17.             (java.io.UnsupportedEncodingException e)  
  18.             {  
  19.             e.printStackTrace();  
  20.             }  
  21.             System.out.println  
  22.             ("--------------\n 8859 bytes:");  
  23.             System.out.println("bytes is:     " + arrayToString(bytesISO8859));  
  24.             System.out.println("hex format is:"  
  25.             + encodeHex(bytesISO8859));  
  26.             System.out.println();  
  27.             System.out.println  
  28.             ("--------------\n GBK bytes:");  
  29.             System.out.println("bytes is:" + arrayToString(bytesGBK));  
  30.             System.out.println("hex format is:" + encodeHex(bytesGBK));  
  31.             }  
  32.   
  33.     public static final String  
  34.             encodeHex (byte[] bytes)  
  35.             {  
  36.             StringBuffer buff =  
  37.             new StringBuffer(bytes.length * 2);  
  38.             String b;  
  39.             for (int i=0; i<bytes.length ; i++)  
  40.             {  
  41.             b = Integer.toHexString(bytes[i]);  
  42.             // byte是两个字节的,而上面的Integer.toHexString会把字节扩展为4个字节  
  43.             buff.append(b.length() > 2 ? b.substring(6,8) : b);  
  44.             buff.append(" ");  
  45.             }  
  46.             return buff.toString();  
  47.             }  
  48.   
  49.     public static final String arrayToString(byte[] bytes) {  
  50.         StringBuffer buff = new StringBuffer();  
  51.         for (int i = 0; i < bytes.length; i++) {  
  52.             buff.append(bytes[i] + " ");  
  53.         }  
  54.         return buff.toString();  
  55.     }  
  56. }  

 

执行上面程序将打印出:

--------------
            8859 bytes:
            bytes is:     72 101 108 108 111 33 63 63 63
            hex format is:48 65 6c 6c 6f 21 3f 3f 3f
            --------------
            GBK bytes:
            bytes is:     72 101 108 108 111 33
            -60 -29 -70 -61 -93 -95
            hex format is:48 65 6c 6c 6f 21 c4 e3 ba c3 a3 a1

可见,在s中提取的8859-1格式的字节数组长度为9,中文字符都变成了“63”,ASCII码为63的是“?”,一些国外的程序在国内中文环境下运行时,经常出现乱码,上面布满了“?”,就是因为编码没有进行正确处理的结果。

分享到:
评论

相关推荐

    java字符串编码转换

    这里的 `getBytes` 方法用于获取字符串对应的字节数组,参数 `"GBK"` 指定了源字符串的编码方式;`new String` 构造函数则指定了目标字符串的编码方式。 #### 四、Web环境下的字符串编码转换 在Web开发中,经常...

    java编码格式转换

    ### Java编码格式转换 在Java开发中,字符编码的转换是一项常见的需求,尤其是在处理国际化文本时。...此外,在进行编码转换时,应尽量选择能够支持更广泛字符集的编码方式(如UTF-8),以提高兼容性和可靠性。

    java 文件编码转换

    Chardet(字符集检测)通常是基于统计模型来判断文件最有可能采用的编码方式。例如,它可以分析字节序列并根据不同的字符集概率进行匹配。这种技术在处理非UTF-8编码的文件时非常关键,因为如果没有正确识别源编码,...

    java_各种编码转换源代码

    在Java中,字符集主要基于Unicode,其中最常用的是UTF-8,它是一种可变长度的编码方式,能够表示几乎所有的世界语言字符。 在处理文本数据时,我们可能会遇到不同的编码格式,例如GBK、ISO-8859-1等。如果不正确地...

    java中编码的转换

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

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

    编码是指将字符转换为字节序列的过程,不同的字符集有不同的编码方式。例如,ASCII编码用1个字节表示一个字符,而UTF-8编码则根据字符的不同,使用1到4个字节。 二、简单字符串的编码转换 在Java中,String类提供了...

    如何用java实现不同编码方式字符串的转换(包含异常处理、重复不终止输入、缓冲区bufferedreader的使用)

    在Java编程中,处理不同编码方式的字符串转换是一项常见的任务,尤其在处理来自不同系统或网络的数据时。本文将深入探讨如何使用Java实现这一过程,同时涵盖异常处理、重复不终止输入以及`BufferedReader`的高效使用...

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

    在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码(Unicode, ISO-8859-1, GBK, UTF-8)及其在Java中的应用,并讨论它们之间的...

    Java字符编码转换过程说明

    如果字符串由于错误的编码转换方式产生,例如ISO8859-1编码的GBK文本,可以使用`new String(text.getBytes("iso8859-1"), "gbk")`将其转换回正确的中文。 7. **JDBC中的编码转换**: JDBC驱动负责处理与数据库...

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

    UTF-8是一种可变长度的Unicode编码方式,它可以高效地表示Unicode字符。UTF-8使用1到4个字节来表示一个字符,对于ASCII字符集中的字符,UTF-8与ASCII完全兼容。 #### 三、编码转换方法 在Java中,可以使用`String`...

    JAVA 转换字符编码工具

    - Unicode:为了解决全球字符集的问题,Unicode包含了世界上几乎所有的字符,常用的有UTF-8、UTF-16和UTF-32等编码方式。 2. **Java中的字符编码** - Java使用Unicode作为内部字符编码,这意味着所有Java字符串都...

    java 编码 UTF-8、ISO-8859-1、GBK

    对于纯Java类文件,处理字符编码的方式略有不同,主要关注源代码文件的编码、输入输出流的编码以及字符串的内部处理。例如,读取文本文件时,应使用`InputStreamReader`和合适的编码参数,如`new InputStreamReader...

    java字符编码问题

    - **UTF-8**:一种变长编码方式,对于英文等常用的字符只需要1个字节,而对于中文等非常用字符则需要2~4个字节。UTF-8是最常用的编码方式之一。 - **UTF-16**:一种固定长度或变长编码方式,对于大部分字符使用2个...

    Java中的String类getBytes()方法详解与实例

    System.out.println("使用平台默认字符编码方式进行转换:"); printBytes(bytesDefault); // 使用UTF-8字符编码方式进行转换 try { byte[] bytesUTF8 = str.getBytes("UTF-8"); System.out.println("\n使用...

    java_字符编码 Javajava_字符编码问题

    字符编码是计算机内部表示字符的一种方式,它涉及到如何将人类可读的文字转换为二进制形式以便计算机处理。 #### 二、Java中的字符串与字符编码 在 Java 中,`String` 类型是一种特殊的类型,它用来表示一系列字符...

    JAVA_字符编码

    此外,Java的`String`类提供了许多与字符编码相关的功能,如`getBytes()`方法可以将字符串转换为字节数组,使用默认的平台字符集,或者指定的`Charset`。而`new String(bytes, charset)`则可以根据给定的字节数组和...

    js解码 、java编码

    其中,Base64是一种常用的编码方式,用于将二进制数据转换为ASCII字符串,以便在网络上传输。在给定的`Base64.js`文件中,很可能包含了用于Base64编码和解码的函数或类。Base64解码通常用于处理例如图片、音频等二...

    java中各种编码转换.pdf

    这种编码方式在处理Unicode文本时非常高效,但可能需要额外的字节顺序标记(BOM)来确定字节顺序。 5. **UTF-16LE (Little Endian)**:与UTF-16BE相反,LE表示“小端”字节顺序,即最低有效字节在前。同样,也需要BOM...

Global site tag (gtag.js) - Google Analytics