为什么JDK8的Base64使用ISO-8859-1编码?

8

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

我发现Base64.Encoder#encodeString中提到,它使用ISO-8859-1来从这些编码字节构建一个字符串。

我完全可以想象ISO-8859-1字符集也包含了所有的base64字母表。

是否有任何可能的原因不使用US-ASCII

1个回答

10

我怀疑这样更有效率:将ISO-8859-1编码转换回文本只需要将每个byte提升为一个char,而对于ASCII,您需要检查byte是否为有效的ASCII。当然,base64的结果始终为相同。

(这只是一个猜测,但是一个有知识的猜测。如果您想验证它,您可以随时运行基准测试...)


1
代码证明了你是正确的。实现直接委托给String(byte[] ascii, int hibyte, int offset, int count),这个构造函数已经被弃用,因为它只对hibyte==0(读取iso-latin-1)有用,对于这种情况,它有一个优化的复制循环。所以在这种特定情况下,这是一种合理和优化的用法。 - Holger
1
尽管如果文档说明正在使用US-ASCII并使用相同的实现,它也可以正常工作。但在文档中说“ISO-8859-1”是潜在实现者的好指针,暗示在这里使用iso-latin-1优于使用ASCII... - Holger
1
@Holger:如果有人同时查看实现和文档,那么这将会非常令人困惑 :) - Jon Skeet
伙计们,对不起,我有点困惑。所以,“ISO-8859-1”实际上比“US-ASCII”更有效,还是编写“Base64”的人决定使用已弃用的构造函数,与任何字符集无关,并注意到提到“ISO-8859-1”会很好? - Jin Kwon
1
@JinKwon:你所说的“更有效”是什么意思?它比ASCII表现得更好,而且实际上就是ISO-8859-1。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接