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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (151)

来自java.lang.StringCoding:

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

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

提问于
用户回答回答于

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

你应该非常很少在实践中看到这一点。通常,平台默认编码将被正确检测。

但是,我强烈建议您在每次执行编码或解码操作时指定明确的字符编码。即使您希望平台默认,也可以明确指定。

用户回答回答于

这有点复杂...

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

  • 默认字符集由系统file.encoding属性提供。
  • 这是缓存的,并且在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类中是否使用了默认的字符集呢?

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

String.getBytes()是否提供它承诺的内容?

Javadoc中定义的合同是正确的。

此字符串不能在默认字符集中编码时,此方法的行为未指定。在CharsetEncoder当需要在编码处理更多的控制类应当被使用。

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

改用此方法:

public byte[] getBytes(String charsetName)

要找到系统的默认设置,只需使用:

Charset.defaultCharset()

扫码关注云+社区