为什么Java I / O中的字节可以表示字符?
为什么Java I / O中的字节可以表示字符?
我看到这些字符只是ASCII。 然后它不是动态的,对吧?
这有什么解释吗?
字节流和字符流有什么区别?
字节不是字符。
在计算方面,“字符”是数字代码(或代码序列)与编码或字符集的配对,其定义代码如何映射到真实世界字符(或空白或控制代码)。
只有与编码配对后,字节才能表示字符。 对于某些编码(如ASCII或ISO-8859-1),一个字节可以表示一个字符……并且许多编码甚至是ASCII兼容的(这意味着0到127的字符代码与ASCII的定义对齐)。但如果没有原始地图,你就不知道你拥有什么。
没有编码,字节只是8位整数。
你可以按照自己喜欢的方式解释它们,甚至可以获得一些可用的东西……但是如果不知道编码,你就不确定它们代表什么。
它甚至可能不是文本。
例如,考虑字节序列0x48 0x65 0x6c 0x6c 0x6f 0x2e
。 它可以解释为:
-
Hello.
采用ASCII和兼容的8位编码; -
dinner
用一些8位编码的dinner
来certificate这一点; -
䡥汬漮
in big-endian UTF-16 * ; - 一个钢蓝色像素,后面是一个灰黄色的像素,RGB;
- 以某种未知处理器的汇编语言
load r101, [0x6c6c6f2e]
;
或者其他一百万件事。 仅这六个字节无法告诉您哪种解释是正确的。
至少使用文本,这就是编码的用途。
但是,如果您希望解释正确,则需要使用相同的编码来解码那些用于生成它们的字节。 这就是了解文本编码方式如此重要的原因。
字节流和字符流之间的区别在于字符流尝试使用字符而不是字节。 (它实际上适用于UTF-16代码单元。但是因为我们知道编码,这对于大多数用途来说已经足够了。)如果它包含在字节流中,则字符流使用编码来转换从基础字节流读取的字节to char
s(或写入流到字节的字符)。
*注意:我不知道“䡥汬漮”是亵渎甚至是否有任何意义……但除非你把它编程为中文,否则电脑也不会。
字节可以表示一些字符,原因与int可以表示long相同。
字符是16位。 字节是8位。 此外,char是无符号的,字节是有符号的。
试着这样做:
char c = 'a'; System.out.println(c); byte b = (byte)c; c = (char)b; System.out.println(c);
这将输出:
a a
现在尝试用nDash替换’a’(unicode 2013)。 喜欢这个:
char c = '–'; System.out.println(c); byte b = (byte)c; c = (char)b; System.out.println(c);
这将输出:
-
在C和C ++中, char
保存单个字节, char
类型用于表示8位整数,以及单个字符的文本。 Java 不是那样的。
在Java中, char
和byte
是不同的数据类型。 char
保存单个Unicode字符,该字符(通常)大于一个字节。 一个byte
包含一个8位整数。 当您将char
(或char[]
或String
)转换为字节数组(类型byte[]
)时,字符串将根据某些字符编码(通常为UTF-8)进行编码,结果就是该特定字符串的编码方式如果是根据该字符编码写入的,则存储在内存中(或磁盘上)。
Java IO支持直接从磁盘读取字节数组( byte[]
),因为这通常适用于二进制文件(即非文本文件,其中不应转换换行符,并且不应重新编码字符串) )。 该文件中的字节可能对应于8位编码中的字符(如ASCII或ISO8859- *),但如果您要以这种方式使用它们,则应该显式转换为char[]
或String
)。
它是一个字节的原因是由于历史上的美国计算。 当基本的计算概念被发明时,内存,速度,存储都非常昂贵(而且很大 )。 设计非常简化,因此专注于北美英语世界(在某种程度上,仍然是)。
多个字节(如int)仅在外国(到美国)市场开放且计算机具有更多RAM和存储空间之后才添加。 世界使用复杂的写入系统,例如中文, 每个字符需要多个字节。 您可能来自世界上需要多字节字符的部分。 当我在北美学习编程时,我甚至需要考虑ASCII字节字节。 Java设计师大多来自北美。
例如,我的北美abcdefghijklmnopqrstuvwxyz
标准中文字典是非常庞大的。