为什么Java的String.getBytes()使用“ISO-8859-1”
from java.lang.StringCoding :
String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
这是从Java.lang.getBytes()中使用的内容,在linux jdk 7中,我总是觉得UTF-8是默认字符集?
谢谢
from java.lang.StringCoding :
String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
这是从Java.lang.getBytes()中使用的内容,在linux jdk 7中,我总是觉得UTF-8是默认字符集?
谢谢
Java 尝试使用默认字符编码通过 String.getBytes() 返回字节。
....这是棘手的部分(可能永远不会发挥作用)....
如果系统无法使用默认字符集(UTF-8 或其他字符集)对字符串进行解码或编码,则将回退到 ISO-8859-1。如果回退不起作用...系统将失败!
....真。。。(喘口气!...如果无法使用我指定的字符集,并且 UTF-8 或 ISO-8859-1 也不可用,它会崩溃吗?
是的。StringCoding.encode(...) 方法中的 Java 源注释状态:
如果我们找不到ISO-8859-1(必需的编码),那么安装就严重出错了。
...然后调用 System.exit(1)
用户 JVM 可能不支持 UTF-8 或 JVM 启动时指定的字符集的解码和编码,尽管可能性不大。
那么,在 getBytes() 期间,字符串类中的默认字符集是否正确使用?
不。但是,更好的问题是...
Javadoc 中定义的协定是正确的。
此方法在无法用默认字符集编码此字符串时的行为未指定。当需要对编码过程进行更多控制时,应使用该类。
CharsetEncoder
始终建议在将字节转换为字符串时显式指定“ISO-8859-1”或“US-ASCII”或“UTF-8”或任何您想要的字符集,反之亦然 - 除非 - 您之前已获得默认字符集并100%确定它是您需要的字符集。
请改用此方法:
public byte[] getBytes(String charsetName)
要查找系统的默认值,只需使用:
Charset.defaultCharset()
希望有所帮助。
默认情况下,无参数方法不使用 ISO-8859-1。如果可以确定,它将使用默认平台编码。但是,如果缺少编码或编码无法识别,则将其回退到ISO-8859-1作为“默认默认值”。String.getBytes()
在实践中,您应该很少看到这种情况。通常,将正确检测到平台默认编码。
但是,我强烈建议您在每次执行编码或解码操作时都指定显式字符编码。即使希望平台为默认值,也请显式指定该值。