在字节和字符串之间转换时,是否应该始终显式地在java中提供编码?

e5nqia27  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(291)

我正在重构一些旧的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.getbytes()不使用):

new String(lResponseAsString.getBytes(), Config.ENCODING_UTF8);

根据我的理解,我将在最后两个例子中使用显式编码参数,并因此贯穿整个应用程序。只是想确定这是不是正确的方法,而且不是多余的。

idv4meu8

idv4meu81#

热释光;博士
是的,您应该始终确保字符编码是按应用程序需要的方式定义的,并且不依赖于“我知道file.encoding总是utf-8”之类的事实。因此,请继续并指定尚未完成的编码。
正如已经在评论中指出的那样

new String(lResponseAsString.getBytes(), Config.ENCODING_UTF8);

不应该写。
这样一段代码背后的错误想法是 lResponseAsString 源于将某些字节序列解析为字符串,但使用了错误的编码。因此它尝试将字符串转换回原始字节,然后再次解析字节,这次使用正确的编码。
首先,作者如何确定在创作中使用了什么编码 lResponseAsString ? 在选择 getBytes() 作为逆转换,他假设这是平台的默认编码。
还有编码 getBytes() 不能保证重现原始字节序列,例如,因为某些字节值在该编码中是非法的。
因此,我们有一个字节数组,它可能与原始的字节序列有点相似,然后我们希望将该字节序列解析为utf-8会给出一个有效的结果。

相关问题