【问题标题】:Importance of specifying the encoding in getBytes in Java在 Java 中的 getBytes 中指定编码的重要性
【发布时间】:2015-09-15 08:14:45
【问题描述】:

我理解在使用适当的格式(例如 hex、base64 等)将 byte[] 转换为 Java 中的 String 时需要指定编码,因为不同平台的默认编码可能不同。但我不确定在将字符串转换为字节时是否理解相同。所以这个问题是为了让我理解在通过网络传输字符串时需要指定字符集的概念。

考虑跟随。 Java中的代码

注意:下面示例中的字符串不是从文件中读取的,而是从另一个资源中创建的。

1: String message = "一条好消息";

2: byte[] encryptedMsgBytes = encrypt(key,,message.getBytes());

3: String base64EncodedMessage = new String (Base64.encodeBase64(encryptedMsgBytes));

我需要使用 Http Post 在网络上发送此信息,并且将在另一端接收和处理(解密、从 base64 转换等)。

根据阅读文章,推荐的做法是使用 .getBytes("utf-8") 在第 2 行,即 message.getBytes("UTF-8")

& 建议在另一端使用类似的方法来处理数据,如下面第 7 行所示

4: 字符串 base64EncodedMsg =

5: byte[] base64EncodedMsgBytes = Base64.encodeBase64(base64EncodedMsg));

6: byte[] decryptedMsgBytes = decrypt(aesKey, "AES", Base64.decodeBase64(base64EncodedMessage);

7: String originalMsg = new String(decryptedMsgBytes, "UTF-8");

鉴于 Java 的内部内存中字符串表示是 utf-16。 (不包括:序列化和文件保存期间的UTF8),如果解密也是用Java完成的,我们真的需要这个吗(注意:这不是一个实际的假设,只是为了便于讨论以了解需要提及编码)?因为,在 JVM 中,第 1 行的字符串“消息”使用 UTF-16 表示,不指定编码的 .getBytes() 方法是否总是返回 UTF-16 字节?或者是不正确的和 .getBytes() 方法没有指定编码总是返回原始字节?由于内部表示是 UTF-16,为什么特定 JVM 上的默认字符编码很重要?

如果它确实返回 UTF-16,那么是否需要在另一端使用 new String(decryptedMsgBytes, "UTF-8") ?

【问题讨论】:

    标签: java string character-encoding byte


    【解决方案1】:

    .getBytes() 方法在不指定编码的情况下不会 总是返回 UTF-16 字节?

    这是不正确的。根据Javadoc,它使用平台的默认字符集:

    使用平台的默认字符集将此String 编码为字节序列,并将结果存储到新的字节数组中。

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 2017-12-11
      • 2016-01-28
      • 2011-03-21
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多