当前位置: 首页 > 知识库问答 >
问题:

为什么Java的字符串。getBytes()使用“ISO-8859-1”

司寇琨
2023-03-14

来自java。lang.StringCodeing:

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

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

谢啦

共有3个答案

丁翰海
2023-03-14

这是出于兼容性的原因。

从历史上看,Windows和Unix上所有未指定字符集的java方法当时都使用通用字符集,即"ISO-8859-1"

正如Isaac和javadoc所提到的,使用默认的平台编码(参见Charset.java):

594    public static Charset defaultCharset() {
595        if (defaultCharset == null) {
596            synchronized (Charset.class) {
597                String csn = AccessController.doPrivileged(
598                    new GetPropertyAction("file.encoding"));
599                Charset cs = lookup(csn);
600                if (cs != null)
601                    defaultCharset = cs;
602                else
603                    defaultCharset = forName("UTF-8");
604            }
605        }
606        return defaultCharset;
607    }

在进行字符串到字节或字节到字符串的转换时,始终指定字符集。

即使是在这种情况下,如字符串。getBytes()您仍然可以找到一个没有采用字符集的未弃用方法(当Java 1.1出现时,大多数方法都已弃用)。就像endianness一样,平台格式是不相关的,相关的是存储格式的规范。

田鹤轩
2023-03-14

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

您应该很少在实践中看到这一点。通常会正确检测到平台默认编码。

然而,我强烈建议您在每次执行编码或解码操作时指定显式字符编码。即使您想要平台默认值,也要明确指定。

司马彦
2023-03-14

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

  • 默认字符集由系统文件提供。编码属性

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

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

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

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

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

。。。然后它调用系统。出口(1)

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

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

不。不过,更好的问题是。。。

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

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

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

改用此方法:

public byte[] getBytes(String charsetName)

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

Charset.defaultCharset()

希望这有帮助。

 类似资料:
  • 问题内容: 我有一个FTP客户端类,它返回指向该文件的InputStream。我想用BufferedReader逐行读取文件。问题是,客户端以二进制模式返回文件,并且文件具有ISO-8859-15编码。 问题答案: 如果文件/流/任何内容真正包含ISO-8859-15编码的文本,则只需在创建InputStreamReader时指定它: 然后,将以Java的本机编码(为UTF-16,而不是UTF-8

  • 问题内容: 我正在开发一个项目,我们需要将我们的信息保存在具有ISO-8859-1表的旧数据库中。因此,在向数据库中写入内容之前,我需要将其从UTF-8转换为ISO-8859-1,并且每次从数据库中检索到它时,都需要将其转换回UTF-8。 我试图将库 **code.google.com/p/go-charset/** 用作以下每个我需要保留的文本字段。 问题是即使使用 toISO88591 函数,

  • 问题内容: 我有ISO-8859-1数据库,所以我希望完全在此代码页中交换请求。那么,如何以正确的方式设置AJAX请求的内容类型呢? 问题答案: 即使这样做很不好(上面有很多评论),也可以:

  • 这就是我现在拥有的: 这确实有效,但似乎NSData使用UTF-8作为输出字符集。但是我需要ISO-8859-1输出字符集中的数据来获得正确的解码。默认设置(UTF-8)失败。 是否有的选项,或者我必须使用C#将其转换? 编辑: 我可以假设ASCII是ISO-8859-1吗? 我认为没有。

  • 在我的nodeJS应用程序中,我使用以下代码行获取req。身体 这工作正常,但对我的应用程序的一个请求会引发以下错误: 如果删除前一行,则该行适用于该请求,但在所有其他请求中,我无法检索数据。有办法解决这个问题吗?