gpt4 book ai didi

java - Java中的字符编码

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:01:12 24 4
gpt4 key购买 nike

我用记事本打开文件,在那里写:“±”保存并关闭。

我尝试用两种方式读取这个文件

首先:

        InputStream inputStream = Files.newInputStream(Paths.get("file.txt"));
int result = inputStream.read();
System.out.println(result);
System.out.println((char) result);

196 Ä

第二个:

        InputStream inputStream = Files.newInputStream(Paths.get("file.txt"));
Reader reader = new InputStreamReader(inputStream);
int result = reader.read();
System.out.println(result);
System.out.println((char) result);

261 ą

问题:1)在二进制模式下,这个字母存为196?为什么不是 261?2)这个字母在什么编码下保存为196?

我试图理解为什么会有差异

最佳答案

UTF-8 编码范围为 U+0080 的值- U+07FF作为 110xxxxx 形式的两个字节10xxxxxx (更多信息请参见 wiki)。所以只有xxxxx xxxxxx 11 个字节可用于值。

ąindexed as U+0105其中 0105是十六进制值(十进制为 261 )。作为二进制,它可以表示为

      01       05    (hex)
00000001 00000101 (bin)
xxx xxxxxxxx <- values for U+0080 - U+07FF range encode only those bits

001 00000101 <- which means `x` will be replaced by only this part

所以UTF-8编码会加上110xxxxx 10xxxxxx mask 这意味着它将结合

110xxxxx 10xxxxxx
00100 000101

进入(两个字节):

11000100 10000101

现在,InputStream原始字节的形式读取数据。所以当你调用inputStream.read();你第一次得到 11000100这是196十进制。打电话inputStream.read();第二次会返回 10000101这是133十进制。

Reader s ware 在 Java 1.1 中引入,因此我们可以避免代码中的这种困惑。相反,我们可以指定 Reader 应该使用什么编码(或让它使用默认编码)来获得正确编码的值,如本例中的 00000001 00000101 (不带掩码)等于 0105十六进制形式和261以十进制形式。


简而言之

  • 使用Reader s(使用正确指定的编码)如果您想将数据读取为文本,
  • 使用Stream s 如果您想以原始字节的形式读取数据。

关于java - Java中的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51671144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com