为什么 ANSI 和 UNICODE 使得使用流读写文本变得困难?

问题描述 投票:0回答:1

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

这些代码转换和不同格式与文本资源有什么关系吗?因此,Reader 和 Writer 可以做什么使它们在处理文本方面比流更好?

java unicode java-stream ansi
1个回答
0
投票

设计 java 时,决定将 text 保存在 java 中作为 Unicode,因此所有脚本,比如希腊语和韩语都可以组合。

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

所以在内部

String
.class 中的常量是 UTF-8 格式的。
char
类型对于 UTF-16 是 2 个字节。并且 String 包含
char
.

的数组

二进制数据,如

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

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

当到达

String, char, Reader, Writer
时,已经完全在Unicode文本上运行了。

桥接类是

InputStreamReader, OutputStreamWriter
Files
提供了一些不错的实用功能。

将这种情况与 C 进行比较,其中 unsigned char 可能与字节相同(或不相同),而宽字符可能可用也可能不可用。 Java 在这方面比某些语言做得更好。然而,具有 C/C++ 背景的 Java 程序员永远不应该对二进制数据使用

String
char[]
:双内存、不可撤销和损坏的转换。相反
byte[], ByteArrayOutputStream, ByteBuffer
.

© www.soinside.com 2019 - 2024. All rights reserved.