来自 java.lang.StringCoding :
String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
这是 Linux jdk 7 中 Java.lang.getBytes() 使用的内容
我一直认为UTF-8是默认字符集?
Thanks
这有点复杂......
Java tries使用 String.getBytes() 使用默认字符编码返回字节。
- 默认字符集由系统 file.encoding 属性提供。
- 这是被缓存的,在 JVM 启动后通过 System.setProperty(..) 更改它是没有用的。
- 如果 file.encoding 属性未映射到已知的字符集,则指定 UTF-8。
....这是棘手的部分(可能永远不会发挥作用)....
如果系统无法使用默认字符集(UTF-8 或其他字符集)对字符串进行解码或编码,则将回退到 ISO-8859-1。如果后备不起作用……系统就会失败!
....真的...(喘气!)...如果我指定的字符集无法使用,并且UTF-8或ISO-8859-1也无法使用,它会崩溃吗?
是的。 Java 源代码注释在 StringCoding.encode(...) 方法中说明:
// 如果我们找不到 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()
希望有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)