Java从String到bytes的转换不是一对一的吗?

标签 java string arrays

我做了简单的测试,似乎 String 到 bytes[] 的 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。

参见 http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html .如果您不需要 BOM,请使用“未标记”变体。

关于Java从String到bytes的转换不是一对一的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9298381/

相关文章:

java - 字符串的八进制值

java - 在 android 中使用 Google map api v2 显示我的轨迹

c - C 中使用条件运算符拆分字符串表达式

C# 防止对列表所做的更改

java - 修饰符 static 只允许在常量变量声明中

java - ArrayList 与 if else 比较

Java正则表达式仅字符串开头

java - 创建我自己的 String 类/子字符串方法

PHP ARRAY 根据日期范围显示数组中的分组数据

c++ - 扁平化为 1D 数组的 2D 和 3D 数组的等效迭代?