为什么Java I/O中的字节可以表示字符?

Kee*_*bze 2 java io byte

为什么Java I/O中的字节可以表示字符?

我看到这些字符只是ASCII.然后它不是动态的,对吧?

这有什么解释吗?

字节流和字符流有什么区别?

cHa*_*Hao 32

字节不是字符.独自一人,他们甚至不能代表人物.

在计算方面,"字符"是数字代码(或代码序列)与编码字符集的配对,其定义代码如何映射到真实世界字符(或空白或控制代码).

只有与编码配对后,字节才能表示字符.对于某些编码(如ASCII或ISO-8859-1),一个字节可以表示一个字符......并且许多编码甚至是ASCII兼容的(意味着0到127的字符代码与ASCII的定义对齐).但如果没有原始地图,你就不知道你拥有什么.

没有编码,字节只是8位整数.

您可以通过强制对它们进行编码来以任何方式解释它们.这正是您在转换bytechar,比如new String(myBytes)等时所做的,甚至是在文本编辑器中编辑包含字节的文件.(在这种情况下,它是应用编码的编辑器.)这样做,你甚至可能得到一些有意义的东西.但是,如果不知道原始编码,您无法确切知道这些字节的意图.

它甚至可能不是文本.

例如,考虑字节序列0x48 0x65 0x6c 0x6c 0x6f 0x2e.它可以解释为:

  • Hello. ASCII和兼容的8位编码;
  • dinner 我用一些8位编码来证明这一点;
  • ???在big-endian UTF-16 * ;
  • 一个钢蓝色像素,后面是一个灰黄色的像素,RGB;
  • load r101, [0x6c6c6f2e] 用一些未知的处理器的汇编语言;

或者其他一百万件事.仅这六个字节无法告诉您哪种解释是正确的.

至少使用文本,这就是编码的用途.

但是,如果您希望解释正确,则需要使用相同的编码来解码用于生成它们的字节.这就是了解文本编码方式如此重要的原因.


字节流和字符流之间的区别在于字符流尝试使用字符而不是字节.(它实际上适用于UTF-16代码单元.但是因为我们知道编码,这对于大多数用途来说已经足够了.)如果它包裹在字节流中,则字符流使用编码来转换从基础字节流读取的字节到chars(或char写入流到字节的s).

*注意:我不知道"䡥汬漮"是亵渎甚至是否有任何意义......但除非你把它编程为中文,否则它也不是计算机.


L. *_*nda 9

字节可以表示一些字符,原因与int可以表示long相同.

Char是16位.字节是8位.此外,char是无符号的,字节是有符号的.

试着这样做:

char c = 'a';
System.out.println(c);
byte b = (byte)c;
c = (char)b;
System.out.println(c);
Run Code Online (Sandbox Code Playgroud)

这将输出:

a
a
Run Code Online (Sandbox Code Playgroud)

现在尝试用nDash替换'a'(unicode 2013).像这样:

char c = '–';
System.out.println(c);
byte b = (byte)c;
c = (char)b;
System.out.println(c);
Run Code Online (Sandbox Code Playgroud)

这将输出:

–