【问题标题】:Converting from String to byte[] to String从 String 转换为 byte[] 到 String
【发布时间】:2012-10-07 02:34:32
【问题描述】:

我遇到过这样一个java字符串,下面是false

body.equals(new String(body.getBytes()));

我想这是因为 String 构造函数默认将正文 byte[] 的编码视为 UTF-8,我不确定 100%。我如何能够将此字符串存储在 byte[] 中并能够稍后将其转换回来?我想我需要能够确定 byte[] 的编码是什么。我该怎么做?

一些上下文:我需要 byte[] 以便我可以压缩数据,将其存储在数据库中,然后解压缩并将未压缩的 byte[] 转换回原始字符串。该字符串最初来自某个下载网页的库,我不确定他们在将其交给我之前对字符串进行了哪些处理。

【问题讨论】:

标签: java character-encoding utf


【解决方案1】:

平台默认字符集用于编码和解码。

问题是,该字符集可能是有限的,例如美国 ASCII。如果字符串中的字符超出该字符集,我们将丢失它。

使用涵盖所有 unicode 字符的字符集,例如UTF-8、UTF-16。

【讨论】:

    【解决方案2】:

    只需确保两种方式都使用相同的字符集 - 从字符串创建字节数组时从字节数组创建字符串时。

    所以你的例子会更好:

    body.equals(new String(body.getBytes("utf-8"), "utf-8"));
    

    这将保证,无论环境如何,字节都会被理解。

    几乎毫无疑问,您还应该使用 unicode。如果您选择单字节编码(例如 ISO 代码页),您将来可能会后悔,即使现在有满足您需求的单字节编码。

    【讨论】:

    • 构造函数的文档和getBytes 都说他们将使用默认字符集,一旦虚拟机启动并缓存了默认字符集,它们就不会改变。
    • @Dunes,是的,虽然我假设实际示例代码行从未出现在实际应用程序中的任何地方 - 它很简单,它显示了要使用的正确构造函数和正确的 @987654323 @方法调用。在实践中,我希望这两个调用按时间分开,并且往返于持久存储。在这种情况下,在两个调用中提供字符集而不依赖于平台默认值会更安全(在任何环境/平台中)。你是绝对正确的,如果你真的在生产中使用这条确切的生产线,你永远不需要这样做。
    【解决方案3】:

    在未指定编码的情况下在字节和字符之间进行转换时,行为取决于平台。使用的默认编码是 JVM 范围的并且取决于您的系统。我不知道如果编码是 ASCII 并且你有一些非 ASCII 字符会发生什么,但我知道你会得到一个不同的字符串。您需要在每次演唱时指定编码以避免这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多