`
casec12
  • 浏览: 46648 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String的getBytes()方法的应用

阅读更多
String的getBytes()方法是得到一个字串的字节数组,这是众所周知的。但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组。如果你在使用这个方法时不考虑到这一点,你会发现在一个平台上运行良好的系统,放到另外一台机器后会产生意想不到的问题。比如下面的程序:

class TestCharset
{

    public static void main(String[] args)
    {
        new TestCharset().execute();
    }

    private void execute() {
        String s = "Hello!你好!";
       
        byte[] bytes = s.getBytes();

        System.out.println("bytes
  lenght is:" + bytes.length);


    }

}

在一个中文WindowsXP系统下,运行时,结果为:

bytes lenght is:12

但是如果放到了一个英文的UNIX环境下运行:

$ java TestCharset
bytes lenght is:9

如果你的程序依赖于该结果,将在后续操作中引起问题。为什么在一个系统中结果为12,而在另外一个却变成了9了呢?上面已经提到了,该方法是和平台(编码)相关的。

在中文操作系统中,getBytes方法返回的是一个GBK或者GB2312的中文编码的字节数组,其中中文字符,各占两个字节。而在英文平台中,一般的默认编码是“ISO-8859-1”,每个字符都只取一个字节(而不管是否非拉丁字符)。

Java中的编码支持

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

class TestCharset
{

    public static void main(String[] args)
    {
        char c = '你';
        int i = c;
        System.out.println(c);
        System.out.println(i);
    }

}

不管你在任何平台上执行,都会有相同的输出:

20320

20320就是Unicode “4f60”的整数值。其实,你可以反编译上面的类,可以发现在生成的.class文件中字符“你”(或者其它任何中文字串)本身就是以Unicode编码进行存储的:

char c = '\u4F60';
        ... ...

即使你知道了编码的编码格式,比如:

javac -encoding GBK TestCharset.java

编译后生成的.class文件中仍然是以Unicode格式存储中文字符或字符串的。使用String.getBytes(String charset)方法

所以,为了避免这种问题,我建议大家都在编码中使用String.getBytes(String charset)方法。下面我们将从字串分别提取ISO-8859-1和GBK两种编码格式的字节数组,看看会有什么结果:


class TestCharset
{

    public static void main(String[] args)
    {
        new TestCharset().execute();
    }

    private void execute() {
        String s = "Hello!你好!";
       
        byte[] bytesISO8859 =null;
        byte[] bytesGBK = null;

        try
        {
            bytesISO8859 =
   s.getBytes("iso-8859-1");
            bytesGBK = s.getBytes("GBK");
        }
        catch
  (java.io.UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }

        System.out.println
  ("--------------
  \n 8859 bytes:");
        System.out.println("bytes is:     " + arrayToString(bytesISO8859));
        System.out.println("hex format is:"
  + encodeHex(bytesISO8859));
        System.out.println();

        System.out.println
  ("--------------
  \n GBK bytes:");
        System.out.println("bytes is:  
  " + arrayToString(bytesGBK));
        System.out.println("hex format
  is:" + encodeHex(bytesGBK));

    }

    public static final String
encodeHex (byte[] bytes)
{
        StringBuffer buff =
  new StringBuffer(bytes.length * 2);
        String b;
        for (int i=0; i< bytes.length ; i++)
        {
            b = Integer.toHexString(bytes[i]);
            // byte是两个字节的,
   而上面的Integer.toHexString会把字节扩展为4个字节
            buff.append(b.length() > 2 ? b.substring(6,8) : b);
            buff.append(" ");
        }
        return buff.toString();
    }

    public static final String
arrayToString (byte[] bytes)
{
        StringBuffer buff = new StringBuffer();
        for (int i=0; i< bytes.length ; i++)
        {
            buff.append(bytes[i] + " ");
        }
        return buff.toString();
    }

}

执行上面程序将打印出:

--------------
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的是“?”,一些国外的程序在国内中文环境下运行时,经常出现乱码,上面布满了“?”,就是因为编码没有进行正确处理的结果。

而提取的GBK编码的字节数组中正确得到了中文字符的GBK编码。字符“你”“好”“!”的GBK编码分别是:“c4e3”“bac3”“a3a1”。得到了正确的以GBK编码的字节数组,以后需要还原为中文字串时,可以使用下面方法:

new String(byte[] bytes,
String charset)
分享到:
评论
1 楼 uqortbsa 2010-10-14  
非常有用,谢谢

相关推荐

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

    ### Java中的String类getBytes()方法详解与实例 #### 简介 在Java编程语言中,`String`类是处理文本数据的核心类之一。它表示一个不可变的字符序列,这意味着一旦创建了一个`String`对象,其内容就不能被更改。在...

    java中的String类常用方法解析(一)

    在Java编程语言中,`...通过阅读和分析`TestString.java`文件,我们可以看到这些方法在实际代码中的应用,从而加深对它们的理解。在进行字符串操作时,应根据具体需求选择合适的方法,以优化性能和提高代码可读性。

    String方法使用方法例子续--android

    这里我们将深入探讨`String`类的一些重要方法及其在Android开发中的应用。 1. **创建与初始化String对象** - `new String()`: 使用此构造函数创建新的字符串对象。 - `""`: 字符串字面量,如`String str = "Hello...

    char,string全部函数方法说明

    在Java编程语言中,`char`和`String`是处理...理解和熟练使用这些方法是Java编程的基本功,对于开发涉及文本处理的应用尤其关键。通过深入学习和实践,开发者可以更有效地实现各种文本操作,提高代码的可读性和性能。

    c#中string转换成字节byte的处理方法

    在C#编程语言中,字符串(string)与字节...综上所述,在C#中进行字符串与字节/字节数组之间的转换时,开发者可以根据实际应用场景选择最适合的方法。理解这些转换背后的原理和细节对于编写高效、可靠的代码至关重要。

    Scala的String类方法整合

    本文将对 `String` 类中的方法进行详细介绍,并提供它们的功能概述与应用场景,旨在帮助开发者更好地理解和应用这些方法。 #### 1. `charAt(int index)` **功能描述**:返回指定索引位置上的字符。 **示例**: ``...

    Android byte[] 和 String互相转换

    在Java和Android中,将字节数组转换为字符串最常用的方法是使用`new String(byte[])`构造函数。此方法会使用平台默认的字符编码,这可能会导致在不同系统上显示不同的结果。为了避免这个问题,我们通常指定一个明确...

    string类的常用方法.zip

    此外,Java和Python的`String`类都有许多其他的方法,如比较方法(equals()、compareTo())、查找方法(startsWith()、endsWith()、contains())、格式化方法(format())以及编码和解码方法(getBytes()、decode()...

    C#_string_byte数组转换解析

    public static byte[] GetBytes(string hexString, out int discarded) { discarded = 0; string newString = ""; char c; // remove all none A-F, 0-9, characters for (int i = 0; i &lt; hexString.Length; i+...

    文件转换(inputString)

    byte[] byteArray = inputString.getBytes(); ByteArrayInputStream bais = new ByteArrayInputStream(byteArray); ``` - 使用`PipedInputStream`和`PipedOutputStream`:这种方法涉及创建管道来传输数据,可以...

    String 与byte[] 间的转换

    在 Java 中,String 类型可以使用 getBytes() 方法将字符串转换为 byte[] 数组,但是这种方法有可能会出现乱码问题,因为 getBytes() 方法使用平台默认的编码方式,这可能会导致乱码问题。为了避免这种问题,我们...

    简单说说JAVA的String和byte[]的关系

    - `getBytes()`: `String`类提供了一个`getBytes()`方法来将字符串转换为字节数组。如果不指定字符集,则使用平台默认的字符集进行编码。 - `getBytes(String charsetName)`: 可以通过指定字符集名称的方式进行...

    10个Java经典的String面试题

    答案:String &gt; byte[] 通过 String 类的 getBytes 方法;byte[] &gt; String 通过 new String(byte[]) 构造器。String 和 byte[] 之间的转换非常常用,在实际应用中经常用到。 这 10 个 Java 经典的 String 面试题...

    Java String与Byte类型转换

    - **字面量转换**: 直接使用`getBytes()`方法将字符串转化为字节数组。例如,`byte[] bytes = "Hello".getBytes();` 这个方法使用平台默认的字符编码,如果需要特定编码(如UTF-8),可以传递编码名称作为参数,如`...

    base64包,decodeBase64包,encodeBase64String包

    在这个场景中,`base64`、`decodeBase64`和`encodeBase64String`相关的包和方法,都是Apache Commons Codec库的一部分。 1. **Base64编码**: `encodeBase64String()`方法是用于将字节数组编码为Base64字符串的。它...

    android GBK转换为String

    在Android开发中,字符编码是一个重要的考虑因素,尤其是在处理中文字符时。GBK是GB2312编码的一个...合理地运用上述方法,能够帮助Android开发者在处理GBK编码数据时避免这类问题,从而提高应用的兼容性和用户体验。

    String(含Hex)与Byte数组互相转换[代码]

    在实际应用中,这些转换方法可能会根据具体需求进行调整,例如处理特定的字符编码或者处理包含特殊字符的字符串。理解并掌握这些基本的转换技巧对于任何IT开发者来说都是非常重要的,特别是在处理数据的存储、传输和...

    JAVA 对word 内容的提取返回String

    System.out.println(new String(content.getBytes(), "utf-8")); in.close(); } } ``` 在上面的代码中,我们使用 `BufferedReader` 对象来读取 Word 文档的内容,然后将其存储在 `content` 变量中。最后,我们将...

    asp.net c# String类添加按字节截取字符串的扩展方法

    在ASP.NET C#开发环境中,处理字符串是一项常见且重要的任务,尤其是在需要对字符串进行...这种扩展方法不仅提高了代码的灵活性,还增强了对复杂字符串数据的处理能力,对于构建高效、稳定的Web应用程序具有重要意义。

    struts之中文乱码问题

    value = new String(value.getBytes("ISO-8859-1"), "UTF-8"); // 其他业务逻辑... } } ``` 通过以上步骤,大部分情况下可以解决Struts框架下的中文乱码问题。然而,具体问题可能需要具体分析,有时还需要检查...

Global site tag (gtag.js) - Google Analytics