我遇到了以下程序,并显示出意想不到的结果。
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),有时它会显示其他序列。它的行为未指明。发生了什么事?
答案 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。