1

我遇到了这样一个java字符串,其中以下是错误的:

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

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

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

4

3 回答 3

2

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

问题是,该字符集可能是有限的,例如 US-ASCII。如果字符串中的字符在该字符集之外,我们将丢失它。

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

于 2012-10-16T22:10:11.313 回答
1

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

所以你的例子会更好:

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

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

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

于 2012-10-16T22:05:38.563 回答
1

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

于 2012-10-16T22:08:59.037 回答