【问题标题】:Why JDK8's Base64 uses ISO-8859-1?为什么JDK8的Base64使用ISO-8859-1?
【发布时间】:2015-07-07 03:08:47
【问题描述】:

我正在为一些受限环境编写自己的 BASE64 编码器/解码器。

我发现Base64.Encoder#encodeString 说它使用ISO-8859-1 从这些编码字节构造一个字符串。

我完全假设 ISO-8859-1 字符集也涵盖了所有 base64 字母。

有什么理由不使用US-ASCII

【问题讨论】:

    标签: character-encoding base64 ascii java-8 iso-8859-1


    【解决方案1】:

    我怀疑它更有效:从 ISO-8859-1 转换回文本只是将每个 byte 直接提升为 char 的问题,而对于 ASCII 你需要检查byte 是否是有效的ASCII。当然,base64 的结果总是相同的。

    (这只是一个猜测,但有根据。如果你想验证它,你总是可以运行基准测试......)

    【讨论】:

    • 代码证明你是对的。 implementation 直接委托给 String(byte[] ascii, int hibyte, int offset, int count),这是一个已弃用的构造函数,因为它仅对 hibyte==0(读取 iso-latin-1)有用,因为它具有优化的复制循环。因此,在这种特定情况下,这是一种合理且优化的用法。
    • 虽然如果 文档 告诉它在使用相同的实现时使用 US-ASCII,它也会起作用。但是在文档中说“ISO-8859-1”对于潜在的实现者来说是一个很好的指针,暗示在这里使用 iso-latin-1 比使用 ASCII 更可取……
    • @Holger:对于任何查看实现和文档的人来说,这会非常令人困惑:)
    • 各位,对不起,我很困惑。所以,ISO-8859-1 实际上比US-ASCII 更有效,或者写Base64 的人决定使用与任何字符集无关的已弃用构造函数,并注意到提及ISO-8859-1 会很棒?
    • @JinKwon:“更有效”是什么意思?它的性能比 ASCII 更好,并且 ISO-8859-1 在现实中。
    猜你喜欢
    • 2014-11-18
    • 2012-09-21
    • 2015-10-11
    • 2011-06-10
    • 2016-02-19
    • 1970-01-01
    • 2015-07-07
    • 2014-08-21
    • 2019-02-21
    相关资源
    最近更新 更多