gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:36:24 29 4
gpt4 key购买 nike

来自 java.lang.StringCoding :

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

这是 Java.lang.getBytes() 在 linux jdk 7 中使用的内容我一直以为 UTF-8 是默认字符集?

谢谢

最佳答案

有点复杂...

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 源注释状态:

// If we can not find ISO-8859-1 (a required encoding) then things are seriously wrong with the installation.

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


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

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

那么,String类在getBytes()时是否正确使用了默认字符集?

没有。然而,更好的问题是......


String.getBytes() 是否兑现了它的 promise ?

Javadoc 中定义的契约是正确的。

The behavior of this method when this string cannot be encoded in the default charset is unspecified. The CharsetEncoder class should be used when more control over the encoding process is required.


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

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

改为使用此方法:

public byte[] getBytes(String charsetName)

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

Charset.defaultCharset()

希望对您有所帮助。

关于java - 为什么 Java 的 String.getBytes() 使用 "ISO-8859-1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12659417/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com