Java问题:从字节序列创建字符串
我偶然发现了以下程序,它显示了意想不到的结果Java问题:从字节序列创建字符串,java,string,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; St
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) + " ");
}
}
公共类StringFromByte
{
公共静态void main(字符串[]args)
{
byte bytes[]=新字节[256];
对于(int i=0;i<256;i++)
字节[i]=(字节)i;
String str=新字符串(字节);
对于(int i=0,n=str.length();i
从技术上讲,这个程序应该按顺序打印0到255之间的整数。但是如果你运行这个程序,有时会显示这个序列(0到255),有时会显示其他序列。其行为未明。发生了什么事?您正在使用的字符串构造函数使用默认字符编码。它可以将某些字节解释为多字节字符 试试这个:
String str = new String(bytes, CharSet.forName( "ISO-8859-1" ));
另请参见,其中列出了标准字符集名称
免责声明:我通常将此构造函数用于UTF-8。您使用的字符串构造函数使用默认字符编码。它可以将某些字节解释为多字节字符 试试这个:
String str = new String(bytes, CharSet.forName( "ISO-8859-1" ));
另请参见,其中列出了标准字符集名称
免责声明:我通常将此构造函数用于UTF-8。对于初学者,Java
字节
类型可以容纳的最大值是127(字节数据类型是一个8位带符号的2的补码整数)。对于初学者,Java字节
类型可以容纳的最大值是127(字节数据类型是一个8位有符号2的补码整数)。其行为未指定
一个字符和一个字节不是一回事,但写这篇文章的人并不知道这一点。unicode大约有600万个字符,但只有256个唯一字节。这意味着许多unicode字符由多个字节表示
示例中的一些字节表示字符需要多个字节,但我猜数组中的“下一个”字节与有效的UTF-8字符不对应
要正确编码非UTF-8字节集中的字符串,请执行以下操作:。
您必须提供正确的字符集,以便Java能够理解字节如何适合字符
您得到不同结果的原因是环境的原因。每个环境都有一个默认的区域设置,用于指定其首选的字符集。您使用的构造函数总是假定一个UTF-8字符集,因此有时它会将源字节误译为乱码。其行为未指定 一个字符和一个字节不是一回事,但写这篇文章的人并不知道这一点。unicode大约有600万个字符,但只有256个唯一字节。这意味着许多unicode字符由多个字节表示 示例中的一些字节表示字符需要多个字节,但我猜数组中的“下一个”字节与有效的UTF-8字符不对应 要正确编码非UTF-8字节集中的字符串,请执行以下操作:。 您必须提供正确的字符集,以便Java能够理解字节如何适合字符
您得到不同结果的原因是环境的原因。每个环境都有一个默认的区域设置,用于指定其首选的字符集。您使用的构造函数总是假定一个UTF-8字符集,因此有时它会将源字节误译为乱码。用
替换字节r
和它的预期效果一样。这是因为字节的最大值为127。用字符替换字节
和它的预期效果一样。这是因为字节的最大值为127。我无法解释非确定性行为,但我确实看到了一个问题。如果将大于127的int值转换为一个字节,它实际上是一个负值,当cast返回到int仍然是负数,因此即使这是确定性的,也无法返回0->255。这甚至不能解决将随机字节放入字符串中所涉及的编码问题。我无法解释非确定性行为,但我确实看到了一个问题。如果将127以上的int值转换为一个字节,则实际上是一个否定的问题ve值,当转换回int时,该值仍为负值,因此即使这是确定性的,也不会返回0->255打印出来。这甚至不能解决将随机字节放入字符串中所涉及的编码问题。但是编码在运行时如何更改?正如Umesh提到的“有时”顺序发生了变化。编码效果应该在不同的运行中保持不变吗?@peakit,不清楚是否所有的运行都在相同的平台上,具有相同的选项。但是编码在运行时是如何变化的?正如Umesh提到的“有时”顺序改变了。在不同的运行中,编码效果不是应该保持不变吗?@peakit,不清楚在同一平台上的所有运行是否都使用相同的选项。因此,如果将这些字节转换的整数替换为-127到127之间的整数,您会得到预期的结果吗?那么如果将这些字节转换的整数替换为-127之间的整数你会得到预期的结果吗?