问题 Java Charset.forName(“ASCII”)或Charset.forName(“US-ASCII”)


我正在编写代码并遇到以下问题。

Charset.forName("ASCII")

但是当我看着java时 文件 它只有

US-ASCII    ISO-8859-1    UTF-8   UTF-16BE   UTF-16LE   UTF-16  

但代码有效。 “ASCII”和“US-ASCII”在这种情况下是同义词吗?或者代码是否采用了一些默认值,因为'ASCII'无法识别? 这个场景中“ASCII”代表一个字符的字节数是多少?


2650
2017-08-18 05:07


起源



答案:


文件指出:

每个字符集都有一个规范名称,也可能有一个或多个   别名。规范名称由此名称方法返回   类。按照惯例,规范名称通常是大写的。该   别名方法返回charset的别名。

此外,javadoc Charset.forName(String charsetName) 告诉你:

charsetName - 请求的字符集的名称;也许是一个   规范名称或 别号

使用此代码,您可以找到有关字符集的更多信息:

Charset ascii = Charset.forName("US-ASCII");
System.out.println(ascii.aliases());
// [ANSI_X3.4-1968, cp367, csASCII, iso-ir-6, ASCII, iso_646.irv:1983, ANSI_X3.4-1986, ascii7, default, ISO_646.irv:1991, ISO646-US, IBM367, 646, us]

System.out.println(ascii.newEncoder().maxBytesPerChar());
// 1.0

Charset utf8 = Charset.forName("UTF-8");
System.out.println(utf8.newEncoder().maxBytesPerChar());
// 3.0

14
2017-08-18 05:36



谢谢,这非常有帮助


答案:


文件指出:

每个字符集都有一个规范名称,也可能有一个或多个   别名。规范名称由此名称方法返回   类。按照惯例,规范名称通常是大写的。该   别名方法返回charset的别名。

此外,javadoc Charset.forName(String charsetName) 告诉你:

charsetName - 请求的字符集的名称;也许是一个   规范名称或 别号

使用此代码,您可以找到有关字符集的更多信息:

Charset ascii = Charset.forName("US-ASCII");
System.out.println(ascii.aliases());
// [ANSI_X3.4-1968, cp367, csASCII, iso-ir-6, ASCII, iso_646.irv:1983, ANSI_X3.4-1986, ascii7, default, ISO_646.irv:1991, ISO646-US, IBM367, 646, us]

System.out.println(ascii.newEncoder().maxBytesPerChar());
// 1.0

Charset utf8 = Charset.forName("UTF-8");
System.out.println(utf8.newEncoder().maxBytesPerChar());
// 3.0

14
2017-08-18 05:36



谢谢,这非常有帮助


运行以下代码段,打印所有可用的字符集:

    SortedMap<String,Charset> availableCharsets = Charset.availableCharsets();
    Set<String> keySet = availableCharsets.keySet();
    for (String key : keySet) {
        System.out.println(key);
    }

我在列表中看不到ASCII。看代码 defaultCharset() 在Charset类中显示如果 file.encoding 是无效的,默认为'utf-8'。

运行以下代码段,将'UTF-8'打印为默认字符集。

    System.setProperty("file.encoding", "ASCII");
    System.out.println(Charset.defaultCharset());

1
2017-08-18 05:14



谢谢,我不知道默认是'utf-8'。
我也没有,直到我检查出来:)。如果有帮助,请接受答案。 - Dakshinamurthy Karra
我的代码似乎与'ASCII'一起使用,其中接收器期望'ASCII'。因此,如果它确实无效并使用'utf-8'那么我的接收器应该不能解码它,是吗?首先,我必须找出它是否确实使用'ASCII'或者如你所提到的那样切换回默认的'utf-8'。然后我会接受答案..再次感谢
“ASCII”有效,它只是一个别名。请参阅Mathias Begert的回答。 - Andreas
@Andreas你是对的。在程序中设置Java时,Java不会覆盖file.encoding。当我给出VM参数时,ASCII打印 US-ASCII 作为charset的名字。谢谢。 - Dakshinamurthy Karra


ASCII是US-ASCII的别名。它为每个字符使用7位字节。

注意:如果您想要紧凑和简洁,我建议使用ISO-8859-1。这也使用每个字符1个字节,但范围更广。它支持 \u0000 至 u00FF 而US-ASCII支持 \u0000 至 \u007F 


0
2017-08-18 05:09



谢谢,似乎IANA更喜欢“US-ASCII”这个名字
除了与传统软件的兼容性之外,您不应该推荐ISO-8859-1。它导致的问题多于它解决的问题,如果你不住在西方(而OP没有),它实际上是完全没用的。 - Karol S
@KarolS我很确定加密数据会在每个国家生成相同的字节。 ;)我说使用ISO-8859-1是一个坏主意,但无论使用哪种语言或字母表,它都可以工作,因为加密在任何地方的工作方式都相同。 - Peter Lawrey