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

为什么Java I/O中的字节可以表示字符?,java,io,byte,Java,Io,Byte,为什么Java I/O中的字节可以表示字符 我看到字符只是ASCII码。那它就不是动态的,对吧 有什么解释吗 字节流和字符流之间有什么区别?字节不是字符。单独使用,它们甚至不能表示字符 在计算方面,“字符”是数字代码(或代码序列)与编码或字符集的配对,该编码或字符集定义了代码如何映射到现实世界的字符(或空格,或控制代码) 只有与编码配对一次,字节才能表示字符。对于某些编码(如ASCII或ISO-8859-1),一个字节可以表示一个字符…许多编码甚至与ASCII兼容(意味着0到127之间的字符代码

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

我看到字符只是ASCII码。那它就不是动态的,对吧

有什么解释吗


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

字节不是字符。单独使用,它们甚至不能表示字符

在计算方面,“字符”是数字代码(或代码序列)与编码或字符集的配对,该编码或字符集定义了代码如何映射到现实世界的字符(或空格,或控制代码)

只有与编码配对一次,字节才能表示字符。对于某些编码(如ASCII或ISO-8859-1),一个字节可以表示一个字符…许多编码甚至与ASCII兼容(意味着0到127之间的字符代码与ASCII的定义对齐)…但是如果没有原始映射,您不知道自己拥有什么

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

您可以通过强制对它们进行编码来以任何方式解释它们。当您将
字节
转换为
字符
,例如
新字符串(myBytes)
等,或者甚至在文本编辑器中编辑包含字节的文件时,这正是您要做的。(在这种情况下,是编辑器应用了编码。)这样做,您甚至可能会得到一些有意义的东西。但是,如果不知道原始编码,您就无法确定这些字节要表示什么

它甚至可能不是文本

例如,考虑字节序列<代码> 0x48 0x65 0x6c 0x6c 0x6f 0x2e < /代码>。可以解释为:

  • 你好。
    采用ASCII码和兼容的8位编码
  • 晚餐
    为了证明这一点,我编了一些8位编码
  • 䡥汬漮大端UTF-16*
    
  • 在RGB中,一个钢蓝色像素后跟一个灰黄色像素
  • 用某个未知处理器的汇编语言加载r101[0x6C6F2E]
或者任何其他的东西。仅仅这六个字节不能告诉你哪种解释是正确的

至少对于文本来说,这就是编码的用途

但如果您希望解释正确,则需要使用与生成这些字节相同的编码来解码这些字节。这就是为什么知道你的文本是如何编码的如此重要


字节流和字符流之间的区别在于,字符流尝试使用字符而不是字节。(它实际上与UTF-16代码单元一起工作。但是由于我们知道编码,这对于大多数目的来说已经足够好了。)如果它围绕字节流,字符流使用编码将从底层字节流读取的字节转换为
char
s(或者将写入流的
char
s转换为字节)

*注:我不知道是否“䡥汬漮" 是亵渎,甚至有任何意义……但计算机也是如此,除非你将其编程为阅读中文。

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

字符是16位。字节是8位。此外,字符是无符号的,字节是有符号的

尝试这样做:

char c = 'a';
System.out.println(c);
byte b = (byte)c;
c = (char)b;
System.out.println(c);
这将输出:

a
a
–  现在尝试用nDash(unicode 2013)替换“a”。如下所示:

char c = '–';
System.out.println(c);
byte b = (byte)c;
c = (char)b;
System.out.println(c);
这将输出:

a
a
–  – 
<> > C和C++,A代码> char < /C> >保存一个字节,类型char < /C> >表示一个8位整数,以及一个文本字符。java是“强>不< /强>。

在Java中,
char
byte
是不同的数据类型。
char
包含一个大于字节的Unicode字符。
byte
包含一个8位整数。当您将
char
char[]
String
转换为字节数组时(type
byte[]
),字符串根据某种字符编码(通常为UTF-8)进行编码,结果是,如果按照该字符编码写入,则该特定字符串将如何存储在内存(或磁盘)中


Java IO支持直接向磁盘或从磁盘读取字节数组(
byte[]
),因为这通常是处理二进制文件的方式(即非文本文件,其中不应转换换行符,也不应重新编码字符串)。该文件中的字节可能对应于8位编码的字符(如ASCII或ISO8859-*),但如果你打算这样使用它们,你应该显式地转换成
char[]
字符串
)。

它之所以是字节,是因为历史上的美国计算。内存、速度和存储都非常昂贵(而且很大)当基本的计算概念被发明时,设计非常简单,因此主要集中在北美英语国家(在某种程度上,现在仍然如此)

多个字节,如int,仅在外部(到美国)之后添加市场开放了,计算机有了更多的RAM和存储空间。世界使用复杂的书写系统,如中文,每个字符需要超过一个字节。。你可能来自世界上需要多字节字符的地区。当我在北美学习编程时,我甚至只需要ASCII字符字节java设计者大多来自北美洲。


例如,根据我的北美
标准,中文书写字母是巨大的

你可能会发现这很有用:我想知道打印的是什么。注意:一些宽字符是32位的。字符串支持这些字符的UTF-16编码。为什么它必须是字节?而不是整数?因为除此之外,几乎所有流都以字节大小的块读取和写入数据。InputStreamReader和OutputStreamWriter以及DataOutputStreams