在解析byte []时确实需要指定字符串编码吗?

时间:2014-01-01 01:16:14

标签: java encoding

据说,从String创建byte[]时指定编码是“最佳做法”:

byte[] b;
String a = new String(b, "UTF-8"); // 100% safe
String b = new String(b); // safe enough

如果我知道我的安装有默认编码utf8,是否真的有必要指定编码仍然是“最佳做法”?

2 个答案:

答案 0 :(得分:3)

此处必须区分不同的用例:如果通过具有指定编码的某些协议从外部源获取字节,则始终使用第一种形式(使用显式编码)。

如果字节的来源是本地机器,例如本地文本文件,则第二种形式(没有显式编码)更好。

请始终牢记,您的程序可能会在具有不同平台编码的其他计算机上使用。它应该在那里工作而不做任何改变。

答案 1 :(得分:1)

  

如果我知道我的安装有默认编码utf8,是否真的有必要指定编码仍然是“最佳做法”?

但您确定您的安装始终的默认编码是UTF-8吗? (或者至少,只要你的代码被使用......)

您是否确定您的代码从不将用于具有不同默认编码的其他安装中?

如果其中任何一个的答案都是“否”(除非你有先见之明,它可能必须是“否”)然后我认为你应该遵循最佳实践...并指定编码,如果这是什么您的应用程序语义要求:

  • 如果要求始终以UTF-8编码(或解码),请使用"UTF-8"

  • 如果要求始终使用平台默认值进行编码(或解码),请执行此操作。

  • 如果要求是支持多种编码(或者要求可能会更改),则将编码名称作为配置(或命令行)参数,解析为Charset对象并使用它。

这种“最佳做法”建议的重点是避免在平台特征发生变化时出现可预见的问题。你不认为这是可能的,但你可能无法完全确定它。但在一天结束时,这是你的决定。

(事实上,你实际上是在考虑“最佳实践”是否适合你的情况,这在我看来是很好的。)