Java字符串字符编码 - 用于法语 - 荷兰语语言环境

Ana*_*man 4 java character-encoding

我有以下代码

public static void main(String[] args) throws UnsupportedEncodingException {
        System.out.println(Charset.defaultCharset().toString());

        String accentedE = "é";

        String utf8 = new String(accentedE.getBytes("utf-8"), Charset.forName("UTF-8"));
        System.out.println(utf8);
        utf8 = new String(accentedE.getBytes(), Charset.forName("UTF-8"));
        System.out.println(utf8);
        utf8 = new String(accentedE.getBytes("utf-8"));
        System.out.println(utf8);
        utf8 = new String(accentedE.getBytes());
        System.out.println(utf8);
}
Run Code Online (Sandbox Code Playgroud)

以上的输出如下

windows-1252
é
?
é
é
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解这是做什么的吗?为何输​​出?

Esa*_*ija 6

如果你已经有了String,那么就不需要对它进行编码和解码,这个字符串已经是有人解码了原始字节的结果.

在字符串文字的情况下,某人是编译器将源读取为原始字节并使用您为其指定的编码对其进行解码.如果你已经用Windows-1252编码物理保存了源文件,并且编译器将其解码为Windows-1252,那么一切都很好.如果没有,您需要通过声明编译器在编译源时使用的正确编码来解决此问题...

这条线

String utf8 = new String(accentedE.getBytes("utf-8"), Charset.forName("UTF-8"));
Run Code Online (Sandbox Code Playgroud)

绝对没有.(编码为UTF-8,解码为UTF-8 == no-op)

这条线

utf8 = new String(accentedE.getBytes(), Charset.forName("UTF-8"));
Run Code Online (Sandbox Code Playgroud)

将字符串编码为Windows-1252,然后将其解码为UTF-8.结果必须只在Windows-1252中解码(因为在Windows-1252中编码,duh),否则你会得到奇怪的结果.

这条线

utf8 = new String(accentedE.getBytes("utf-8"));
Run Code Online (Sandbox Code Playgroud)

将字符串编码为UTF-8,然后将其解码为Windows-1252.同样的原则适用于以前的情况.

这条线

utf8 = new String(accentedE.getBytes());
Run Code Online (Sandbox Code Playgroud)

绝对没有.(编码为Windows-1252,解码为Windows-1252 == no-op)

与可能更容易理解的整数类比:

int a = 555;
//The case of encoding as X and decoding right back as X
a = Integer.parseInt(String.valueOf(a), 10);
//a is still 555

int b = 555;
//The case of encoding as X and decoding right back as Y
b = Integer.parseInt(String.valueOf(b), 15);
//b is now 1205 I.E. strange result
Run Code Online (Sandbox Code Playgroud)

这两个都没用,因为在做任何代码之前我们已经拥有了我们需要的东西,整数555.

当您的字符串离开系统时需要将字符串编码为原始字节,并且当它们进入您的系统时需要将原始字节解码为字符串.无需在系统内右后卫进行编码和解码.