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

了解字符串编码/解码Java

孔运良
2023-03-14

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

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 ▒▒▒

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

共有1个答案

桓嘉谊
2023-03-14

字符串éàè用UTF-8编码为字节八位数0xC3 0xA9 0xC3 0xA0 0xC3 0xA8。这些解释为Windows-1252的字节八位元组是字符串值 (其中 是一个不间断的空格字符,Unicode codepointU+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编码字节作为输出时,您所看到的行为就会发生。

 类似资料:
  • 问题内容: ’=?KOI8-R?B?W1JFUS0wMDI1NDEtNDc5NzddIO / h7yAi89TSz8rGwdLGz9IiIDs =?= \ r \ n \ t =?KOI8-R?B?Ry43MjkgKDEwKQ ==?=’ 如何将其转换为可读的内容?谢谢 ! 问题答案: email.header.decode_header(‘=?KOI8-R?B?W1JFUS0wMDI1NDEtN

  • 问题内容: 这是我尝试的错误消息。我究竟做错了什么? UnicodeEncodeError:’ascii’编解码器无法在位置37编码字符u’\ xa0’:序数不在范围内(128) UnicodeDecodeError:’ascii’编解码器无法解码位置37的字节0xc2:序数不在范围内(128) 问题答案: 您无法解码,也无法编码。尝试以另一种方式进行操作。

  • 以下是我尝试的错误信息。我做错了什么? UnicodeEncodeError:“ASCII”编解码器无法编码位置37中的字符U“\XA0”:序号不在范围(128)中

  • 初识Unicode 编码 # codecs_to_hex.py import binascii def to_hex(t, nbytes): """Format text t as a sequence of nbyte long values separated by spaces. """ chars_per_item = nbytes * 2 he

  • 我想将一个字符串编码成并通过套接字传输它,然后解码回来。 下面是我的代码,结果是“77+9x6s=” 有什么想法如何实现这一点吗?

  • 问题内容: 我是python3的新手,来自python2,并且我对unicode基本概念有些困惑。我读了一些不错的文章,使事情变得更加清楚,但是我看到python 3上有2种方法可以处理编码和解码,而且我不确定要使用哪种方法。 因此,Python 3中的想法是,每个字符串都是unicode,并且可以按字节进行编码和存储,或者可以再次解码回unicode字符串。 但是有两种方法可以做到: 会生成,但