为什么ANSI和UNICODE难以使用流读取和写入文本?

时间:2017-04-19 21:14:47

标签: java unicode ansi

我已经了解到java中的Reader和Writer更适合从文本资源中读取和写入信息,而Reader / Writer是基于字符的,而流是基于字节的。 然而,我遇到一个消息来源说“有些文本是用ANSI或Unicode编码的.ANSI需要代码转换,Unicode可以用不同的格式编码,如UFT-8或UFT-16。因此读者/写入器更好”。

这些代码转换和不同格式是否与文本资源有关?因此,读者和作者能做什么使得他们在处理文本时比流更好?

1 个答案:

答案 0 :(得分:0)

当设计java时,决定将java中的 text 保存为Unicode,因此可以合并所有脚本,例如希腊文和韩文。

Unicode是所有符号的编号(代码点),可以通过UTF-8编码(多字节,一般最紧凑),UTF-16 LE / BE(2字节) )甚至是UTF-32。

所以.class中的内部String常量是UTF-8。对于UTF-16,类型char是2个字节。 String保存了一个char的数组。

二进制数据,如byte[]InputStream/OutputStream可以是文字。但要将其解释为 text ,需要知道这些字节的编码/字符集。因此,总是将字节和这些字节的一些字符集转换为内部Unicode(UTF-16)。

要回答这个问题,以某种方式提供二进制数据的字符集是不可避免的。这是二进制数据的缺陷。

当一个人到达String, char, Reader, Writer时,一个人已完全使用Unicode文本。

桥接类为InputStreamReader, OutputStreamWriterFiles提供了一些不错的实用功能。

将此情况与C进行比较,其中unsigned char可能与字节相同(或不相同),并且宽字符可能可用或不可用。 Java比一些语言做得更好。但是,具有C / C ++背景的Java程序员永远不应该使用Stringchar[]来获取二进制数据:双内存,不可撤销和损坏的转换。而是byte[], ByteArrayOutputStream, ByteBuffer