在字节和字符串之间转换时,您是否应该始终在 Java 中明确提供编码?
Should you always explicitly provide encoding in Java when converting between bytes and Strings?
我正在重构一些旧的 Java 应用程序。它使用 HTTP 请求与一些外部服务通信,因此它处理字节和字符串。假设应该使用 UTF-8 编码。
我想知道的是——在从字符串转换为字节时,我是否应该始终明确提供编码,反之亦然?或者我可以只依赖 file.encoding 属性 在我的系统中实际上是“UTF-8”吗? (所以下面的例子在我的电脑上运行良好)
我遇到了一些代码行,建议应该明确说明编码,例如:
new String(bodyMessageBytes, "UTF-8");
但是话又说回来,在不同的地方没有明确说明编码,所以默认的编码(来自 file.encoding 属性)将被采用我假设(InputStreamReader 构造函数):
BufferedReader lBufferedReader = new BufferedReader(new InputStreamReader(lPostMethod.getResponseBodyAsStream()));
或者(这里的String构造函数使用了显式编码,但是String.getBytes()没有):
new String(lResponseAsString.getBytes(), Config.ENCODING_UTF8);
根据我的理解,我会在最后两个示例中以及整个应用程序中使用显式编码参数。只是想确定这是否是正确的方法并且它不是多余的。
TL;DR
是的,您应该始终确保字符编码是按照您的应用程序需要的方式定义的,而不是依赖于诸如“我知道 file.encoding 始终是 UTF-8”之类的事实。因此,继续并在尚未完成的地方指定编码。
正如评论中已经指出的那样,
new String(lResponseAsString.getBytes(), Config.ENCODING_UTF8);
永远不应该写。
这样一段代码背后的错误想法是 lResponseAsString
来自将一些字节序列解析为字符串,但使用了错误的编码。因此它尝试将 String 转换回原始字节,然后再次解析字节,这次使用正确的编码。
首先,作者如何确定在创建lResponseAsString
时使用了什么编码?在选择 getBytes()
作为逆向转换时,他假设这是平台默认编码。
还有一些编码 getBytes()
不能保证重现原始字节序列,例如因为某些字节值在该编码中是非法的。
那么,我们有一个可能与原始字节序列隐约相似的字节数组,然后我们希望将该字节序列解析为 UTF-8 给出有效结果。
我正在重构一些旧的 Java 应用程序。它使用 HTTP 请求与一些外部服务通信,因此它处理字节和字符串。假设应该使用 UTF-8 编码。 我想知道的是——在从字符串转换为字节时,我是否应该始终明确提供编码,反之亦然?或者我可以只依赖 file.encoding 属性 在我的系统中实际上是“UTF-8”吗? (所以下面的例子在我的电脑上运行良好)
我遇到了一些代码行,建议应该明确说明编码,例如:
new String(bodyMessageBytes, "UTF-8");
但是话又说回来,在不同的地方没有明确说明编码,所以默认的编码(来自 file.encoding 属性)将被采用我假设(InputStreamReader 构造函数):
BufferedReader lBufferedReader = new BufferedReader(new InputStreamReader(lPostMethod.getResponseBodyAsStream()));
或者(这里的String构造函数使用了显式编码,但是String.getBytes()没有):
new String(lResponseAsString.getBytes(), Config.ENCODING_UTF8);
根据我的理解,我会在最后两个示例中以及整个应用程序中使用显式编码参数。只是想确定这是否是正确的方法并且它不是多余的。
TL;DR
是的,您应该始终确保字符编码是按照您的应用程序需要的方式定义的,而不是依赖于诸如“我知道 file.encoding 始终是 UTF-8”之类的事实。因此,继续并在尚未完成的地方指定编码。
正如评论中已经指出的那样,
new String(lResponseAsString.getBytes(), Config.ENCODING_UTF8);
永远不应该写。
这样一段代码背后的错误想法是 lResponseAsString
来自将一些字节序列解析为字符串,但使用了错误的编码。因此它尝试将 String 转换回原始字节,然后再次解析字节,这次使用正确的编码。
首先,作者如何确定在创建lResponseAsString
时使用了什么编码?在选择 getBytes()
作为逆向转换时,他假设这是平台默认编码。
还有一些编码 getBytes()
不能保证重现原始字节序列,例如因为某些字节值在该编码中是非法的。
那么,我们有一个可能与原始字节序列隐约相似的字节数组,然后我们希望将该字节序列解析为 UTF-8 给出有效结果。