Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java问题:从字节序列创建字符串_Java_String - Fatal编程技术网

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之间的整数你会得到预期的结果吗?