【问题标题】:Is specifying String encoding when parsing byte[] really necessary?解析 byte[] 时指定字符串编码真的有必要吗?
【发布时间】:2014-01-01 01:16:14
【问题描述】:

据推测,从byte[] 创建String 时指定编码是“最佳实践”:

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

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

【问题讨论】:

标签: java encoding


【解决方案1】:

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

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

请始终牢记,您的程序可能会在具有不同平台编码的不同机器上使用。它应该在那里工作而无需任何更改。

【讨论】:

    【解决方案2】:

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

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

    您是否确定您的代码永远不会在具有不同默认编码的不同安装中使用?

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

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

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

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

    此“最佳实践”建议的重点是避免在您的平台特性发生变化时出现的可预见问题。您认为这不太可能,但您可能无法完全确定。但归根结底,这是您的决定。

    (在我看来,您实际上正在考虑“最佳实践”是否适合您的情况,这是一件好事......)

    【讨论】:

    • IMO 即使代码永远不会在任何其他平台上使用,而不是默认编码为 UTF-8 的平台,指定它仍然是值得的 - 它更具可读性和更清晰的理解方式,并且在编写代码时确实应该考虑代码的读者。
    • 您的可读性点值得商榷。您正在权衡“清晰度”与“冗余代码”。 (虽然我倾向于同意你的观点,但这只是我个人的偏见。)我没有提到这一点的原因是,作为“最佳实践”建议基础的脆弱性/可移植性问题要强得多。
    • 但如果两者的答案都是“是”,那么您可以忽略它。
    • 如果你能向我证明你有先见之明,我愿意相信那些“是”的答案。然后我会很高兴离开它。 :-)
    • 说真的,这归结为在便利性和防范可能发生或不可能发生的事情之间进行权衡。 >>I
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2011-09-22
    • 2018-04-05
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多