Java问题:从字节序列创建字符串

时间:2011-03-08 17:33:04

标签: java string

我遇到了以下程序,并显示出意想不到的结果。

public class StringFromByte
{
       public static void main(String[] args)
       {
             byte bytes[] = new byte[256];

             for(int i = 0; i < 256; i++)
                 bytes[i] = (byte)i;

             String str = new String(bytes);
             for(int i = 0, n = str.length(); i < n; i++)
                 System.out.print((int)str.charAt(i) + " ");
       }
}  

从技术上讲,这个程序应该按顺序打印0到255之间的整数。但是,如果您运行程序有时会显示此序列(0到255),有时它会显示其他序列。它的行为未指明。发生了什么事?

4 个答案:

答案 0 :(得分:2)

您正在使用的String构造函数使用默认字符编码。它可以将一些字节解释为多字节字符。

试试这个:

         String str = new String(bytes, CharSet.forName( "ISO-8859-1" ));

另请参阅CharSet API documentation,其中列出了标准的CharSet名称。

免责声明:我通常将此构造函数用于UTF-8。

答案 1 :(得分:1)

其行为并未指明。

字符与字节不同,但写这个字符的人不知道。 unicode中大约有六百万个字符,但只有256个唯一字节。这意味着许多unicode字符由多个字节表示。

示例中的某些字节表示该字符需要多个字节,但我猜测数组中的“下一个”字节与有效的UTF-8字符不对应。

从一组非UTF-8的字节use this constructor中正确编码一个字符串。 您必须提供正确的字符集,以便Java可以理解字节如何适合字符。

你得到不同结果的原因是因为环境。每个环境都有一个默认的Locale,它指定了它的首选字符集。您使用的构造函数始终采用UTF-8字符集,因此有时会将源字节错误地转换为乱码。

答案 2 :(得分:0)

嗯,对于初学者来说,Java byte类型可以容纳的最大值是127(字节数据类型是8位带符号的二进制补码整数)。

答案 3 :(得分:0)

byte替换为char,并按预期工作。这是因为字节的最大值为127。