在 Java 中将 UTF-8 文本文件读取为 UTF-16

Reading UTF-8 text file as UTF-16 in Java

我正在我的 Java 程序中将 UTF-8 编码的文本文件读取为 UTF-16,只是为了看看会发生什么。我得到的输出字符串只包含“?”。谁能解释一下 UTF-8 代码点是如何转换为 UTF-16 的,为什么我只得到“?”在我的输出中。

这是代码-

public class MyUTF {

    public static void main(String[] args)
        throws IOException, FileNotFoundException
    {
        InputStream is=new FileInputStream("file1.txt");
        System.out.println(is.available());

        InputStreamReader isr=new InputStreamReader(is,"UTF-16");
        BufferedReader br=new BufferedReader(isr);
        System.out.println(br.readLine());
    }
}

如果文件包含 'a' 那么我得到“?”作为输出。 如果它包含 'abc' 那么我得到 '??'.

请解释这种从 UTF-8 到 UTF-16 的转换。

提前致谢。

您在终端中看到的内容取决于许多因素:

  • 你的平台是小端还是大端?
  • 你的终端能显示很多字符还是只显示几个字符?

如果您只看到问号,则您的计算机可能很旧,或者终端仿真器非常笨拙。

我可以告诉你我在 Mac 上看到的内容。我的笔记本电脑是小端。我使文件 file1.txt 包含 abc 然后换行。也就是说,四个字符U+0061 U+0062 U+0063 U+000A。现在由于 UTF-8 是默认 编码 我的文件包含 4 个字节:

61 62 63 0A

请理解一个文件只包含字节。它不包含字符。(当然有一些技巧,例如在文件中粘贴 BOM 以使文件的预期编码显而易见,但实际上这只是一个建议。)

现在,当您以 UTF-16 格式读入该文件时,您 将这四个字节解码 为两个字符:

U+6162
U+630A

当我运行你的程序时,它对我来说是这样打印的

慢挊

现在假设我没有换行符,所以文件只有三个字节。在这种情况下

61 62 63

现在我运行你的程序我看到了

慢�

和之前一样是字符U+6162,然后是替换字符,因为你无法解码UTF-16中的单字节63。在 UTF-16 中,字符以 2 或 4 个字节表示,而不仅仅是 1 个字节。我的终端程序显示替换字符。我认为你的只是显示问号。