java - InputStream和InputStreamReader在读取多字节字符时的区别

标签 java character-encoding io

InputStream 的区别和 InputStreamReaderInputStream读作 byte , 而 InputStreamReader读作 char .例如,如果文件中的文本是 abc ,然后他们都工作正常。但是如果文本是 a你们 ,由 a 组成和两个汉字,然后是InputStream不工作。

所以我们应该使用 InputStreamReader ,但我的问题是:

InputStreamReader 怎么样?识别字符?

a是一个字节,但是一个汉字是两个字节。是否阅读 a作为一个字节并将另一个字符识别为两个字节,或者对于此文本中的每个字符,InputStreamReader把它读成两个字节?

最佳答案

InputStream 读取原始八位字节(8 位)数据。在Java 中,byte 类型等价于C 中的char 类型。在C 中,该类型可用于表示字符数据或二进制数据。在 Java 中,char 类型与 C wchar_t 类型有更大的相似之处。

InputStreamReader 然后会将数据从某种编码转换为 UTF-16。如果“a你们”在磁盘上编码为UTF-8,则为61 E4 BD A0 E4 BB AC的字节序列。当您将 InputStream 以 UTF-8 编码传递给 InputStreamReader 时,它将被读取为字符序列 0061 4F60 4EEC

Java 中的字符编码 API 包含执行此转换的算法。您可以找到 Oracle JRE here 支持的编码列表。 . ICU project如果您想了解其在实践中的工作原理,这是一个很好的起点。

作为 Alexander Pogrebnyak points out ,您应该几乎总是明确地提供编码。未指定编码的 byte-to-char 方法依赖于 JRE default ,这取决于操作系统和用户设置。

关于java - InputStream和InputStreamReader在读取多字节字符时的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5764065/

相关文章:

php curl 日语输出乱码

python - 在python中将字符串视为文件

java - 读入一个没有标点符号的文件

java - AttributeOverride 将空值设置为未映射的字段

java - 对数组中的每个标签使用 addMouseListener() 吗?

java - 加密 Web 应用程序在本地运行良好,但在云上运行不佳

java - 解释以下 Java/Groovy 行为

c++ - MSVC++ 中的源字符集编码规范,如 gcc "-finput-charset=CharSet"

java - IO 的 GoF 装饰器模式用例和示例

Java Mac OS X 应用程序名称更正