为什么Java的String.getBytes()使用“ISO-8859-1”

2022-09-02 11:21:21

from java.lang.StringCoding :

String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;

这是从Java.lang.getBytes()中使用的内容,在linux jdk 7中,我总是觉得UTF-8是默认字符集?

谢谢


答案 1

这有点复杂...

Java 尝试使用默认字符编码通过 String.getBytes() 返回字节。

  • 默认字符集由系统文件.编码属性提供。
  • 这是缓存的,在JVM启动后通过System.setProperty(..)更改它是没有用的。
  • 如果 file.encoding 属性未映射到已知字符集,则指定 UTF-8。

....这是棘手的部分(可能永远不会发挥作用)....

如果系统无法使用默认字符集(UTF-8 或其他字符集)对字符串进行解码或编码,则将回退到 ISO-8859-1。如果回退不起作用...系统将失败!

....真。。。(喘口气!...如果无法使用我指定的字符集,并且 UTF-8 或 ISO-8859-1 也不可用,它会崩溃吗?

是的。StringCoding.encode(...) 方法中的 Java 源注释状态:

如果我们找不到ISO-8859-1(必需的编码),那么安装就严重出错了。

...然后调用 System.exit(1)


那么,为什么在 getBytes() 方法中有意回退到 ISO-8859-1 呢?

用户 JVM 可能不支持 UTF-8 或 JVM 启动时指定的字符集的解码和编码,尽管可能性不大。

那么,在 getBytes() 期间,字符串类中的默认字符集是否正确使用?

不。但是,更好的问题是...


String.getBytes() 是否实现了它所承诺的?

Javadoc 中定义的协定是正确的。

此方法在无法用默认字符集编码此字符串时的行为未指定。当需要对编码过程进行更多控制时,应使用该类。CharsetEncoder


好消息(以及更好的做事方式)

始终建议在将字节转换为字符串时显式指定“ISO-8859-1”或“US-ASCII”或“UTF-8”或任何您想要的字符集,反之亦然 - 除非 - 您之前已获得默认字符集并100%确定它是您需要的字符集。

请改用此方法:

public byte[] getBytes(String charsetName)

要查找系统的默认值,只需使用:

Charset.defaultCharset()

希望有所帮助。


答案 2

默认情况下,无参数方法不使用 ISO-8859-1。如果可以确定,它将使用默认平台编码。但是,如果缺少编码或编码无法识别,则将其回退到ISO-8859-1作为“默认默认值”。String.getBytes()

在实践中,您应该很少看到这种情况。通常,将正确检测到平台默认编码。

但是,我强烈建议您在每次执行编码或解码操作时都指定显式字符编码。即使希望平台为默认值,也请显式指定该值。


推荐