Java从字符串到字节的转换不是一个吗?

Java从字符串到字节的转换不是一个吗?,java,string,bytearray,Java,String,Bytearray,我做了一个简单的测试,似乎字符串到字节[]的Java转换不是一个,至少使用UTF-8是这样的。 守则: byte[] bytes1 = {-1, 127, 0, 38, 97, 104, 55, 110, 50, -24, -48, 59, -20, -6, 64, 1, 4, 107, 56, 54 }; String msg = new String( bytes1, "UTF-8" ); byte[] bytes2 = msg.getB

我做了一个简单的测试,似乎字符串到字节[]的Java转换不是一个,至少使用UTF-8是这样的。
守则:

    byte[] bytes1 = {-1, 127, 0, 38, 97, 104, 55, 110, 50, -24, -48, 59, -20, -6, 64, 1, 4, 107, 56, 54 };      
    String msg  = new String( bytes1, "UTF-8" );        
    byte[] bytes2 = msg.getBytes( "UTF-8" );                            
    for( byte curr : bytes1 ) {         
        System.out.print( curr );
        System.out.print( ", " );
    }
    System.out.println();
    for( byte curr : bytes2 ) { 
        System.out.print( curr );
        System.out.print( ", " );
    }
我想我会看到两行相等的输出。实际上是:

 -1, 127, 0, 38, 97, 104, 55, 110, 50, -24, -48, 59, -20, -6, 64, 1, 4, 107, 56, 54, 

 -17, -65, -67, 127, 0, 38, 97, 104, 55, 110, 50, -17, -65, -67, -17, -65, -67, 59, -17, -65, -67, -17, -65, -67, 64, 1, 4, 107, 56, 54, 

我想知道为什么会发生这种情况,以及我如何才能实现一次转换。有人知道吗?

你不能对任意文本进行编辑。从UTF-16(字符串中的表示形式)到UTF-8的转换定义为非一对一。请参阅Unicode.org上的Unicode标准

看起来您真正想要的是将“UTF-16”作为字符集传递,从而要求对UTF-16进行字节序列化,而不是转换为UTF-8


看。如果您不想要BOM表,请使用“未标记”变体。

一般来说,我的问题的答案是否定的。从字节到字符串再到字符串的转换不是一个,因为有两个事实:
1.字符串的内部表示为每个字符两个字节,在许多编码(例如UTF-8)中,字符代码长度是可变的,因此可能会在末尾添加一些字节,尤其是在字节数组的初始长度为偶数的情况下。 2.编码可以添加几个字节作为其特定pupos的前缀。例如,UTF-16添加了两个字节后缀,告诉字符中要使用的字节顺序。

然而,我需要这个转换是为了非常特殊的目的。我想在我们的应用程序之间使用AmazonSQ传递小对象。我们使用Kryo序列化程序,它将对象转换为字节数组,但SQS消息是字符串。因此,我不使用“真实”字符串,我的解决方法是:
1.如果字符串长度为偶数,则向字节数组添加三个字节:0,1,1,否则添加两个字节:0,0。 2.使用
将字节数组转换为字符串

    message = URLEncoder.encode( new String( bytes, "UTF-16LE" ), "UTF-16LE" );
UTF-16LE,因为字符中字节的顺序已经知道,它避免了两个字节前缀。
3.将消息发送到队列。 4.其他应用程序从队列读取消息并创建

    byte[] bytes = URLDecoder.decode( message, "UTF-16LE" ).getBytes( "UTF-16LE" );

五,。如果最后一个字节为0,则使用除最后两个之外的所有字节进行反序列化,否则使用除最后三个之外的所有字节。

UTF-16也不是一个。如果我将UTF-8更改为UTF-16,则字节数组几乎相等,但有两个区别:两个额外的数字-2,-1,-1,127,0,38,97,104,55,110,50,-24,-48,59,-20,-6,64,1、4、107、56、54,更简单但不紧凑的解决方案,是在apache公共编解码器中使用Base64。看见