Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Java中的字符串编码/解码_Java_Encoding_Utf 8_Character Encoding - Fatal编程技术网

理解Java中的字符串编码/解码

理解Java中的字符串编码/解码,java,encoding,utf-8,character-encoding,Java,Encoding,Utf 8,Character Encoding,我有一个用mvn exec:java运行的程序(我的主文件是用utf-8编码的,系统的默认字符集是windows-1252) 我不明白为什么第一次打印有效,根据文档getBytes使用给定的字符集将字符串编码为字节序列,而字符串构造函数通过使用平台的默认字符集解码指定的字节数组来构造新字符串 所以第一次打印用UTF-8编码,然后用平台的默认字符集windows-1252解码,这怎么可能工作呢?它无法使用平台字符集windows-1252对编码的utf-8字节数组进行解码 第二张打印错误,我不明白

我有一个用mvn exec:java运行的程序(我的主文件是用utf-8编码的,系统的默认字符集是windows-1252)

我不明白为什么第一次打印有效,根据文档getBytes使用给定的字符集将字符串编码为字节序列,而字符串构造函数通过使用平台的默认字符集解码指定的字节数组来构造新字符串

所以第一次打印用UTF-8编码,然后用平台的默认字符集windows-1252解码,这怎么可能工作呢?它无法使用平台字符集windows-1252对编码的utf-8字节数组进行解码


第二张打印错误,我不明白为什么。由于我的文件是用utf-8编码的,平台字符集是windows-1252,所以我打算用windows-1252字符集对字符串进行编码,因此我调用s.getBytes(charset.forName(“windows-1252”))然后用前面的结果创建一个字符串,但它不起作用

字符串值èè在UTF-8中编码为字节八位组
0xC3 0xA9 0xC3 0xA0 0xC3 0xA8
。这些被解释为Windows-1252的字节八位字节是字符串值
U>U+00A0
(其中
是不间断空格字符,Unicode码点
U+00A0

在第一个示例中,将
字符串
转换为上述UTF-8字节,然后使用Windows-1252而不是UTF-8将字节转换回
字符串
。因此,您应该得到一个新的
字符串
。然后将该
字符串写入控制台,因此使用Windows-1252将其编码回字节八位字节
0xC3 0xA9 0xC3 0xA0 0xC3 0xA8
,如果控制台按原样显示字节,则应将其显示为
ÃÃ
(或类似内容)。另一方面,如果控制台配置为UTF-8,则当解释为UTF-8时,这些字节将显示为
èè

在第二个示例中,由于您正在使用Windows-1252进行编码和解码,并且所讨论的特定字符受Windows-1252的支持,因此在将其写入控制台之前,您应该以原始
字符串
èè
结束。如果使用Windows-1252将该
字符串
编码为字节,并且控制台配置为UTF-8,那么您就可以理解为什么没有显示
è
字符串
èè
在Windows-1252中编码为字节八位字节
0xE9 0xE0 0xE8
,这不是有效的UTF-8字节八位字节序列


简言之,当您的控制台配置为将传出字节解释为UTF-8,但您没有将正确的UTF-8编码字节作为输出时,您看到的行为就会发生。

Try
PrintStream out=new PrintStream(System.out,true,“windows-1252”);out.println(s)
作为旁注,MS-DOS默认字符集不是1252,请参见此处:PrintStream out=new PrintStream(System.out,true,“windows-1252”);不起作用,但PrintStream out=新的PrintStream(System.out,true,“utf-8”);does@Berger你是对的,我用MinGW来执行我的程序,使用MS-DOS程序工作正常这是对问题的重述,不是答案。如果你认为他的控制台设置为UTF-8,你应该先这样做。我并没有重复这个问题。问题是要了解编码的行为如何不同于预期。我想我回答了,莱德被埋葬了。现在在最后一段有了更多的意义。exact@RemyLebeau,我忘了考虑控制台的编码。实际上,无论我使用MinGW控制台还是MS-DOS,结果都不同
System.out.println(Charset.defaultCharset()); //print windows-1252
String s = "éàè";
System.out.println(new String(s.getBytes(Charset.forName("UTF-8")))); //OK Print éàè
System.out.println(new String(s.getBytes(Charset.forName("windows-1252")))); //Not OK Print ▒▒▒