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

时间:2018-02-11 07:41:37

标签: java encoding utf-8 character-encoding utf-16

我在我的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的转换。

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

  • 您的平台是小端还是大端?
  • 您的终端可以显示多个字符还是只显示几个字符?

如果你只是看到问号,你可能有一台旧电脑或一个非常蹒跚的终端模拟器。

我可以告诉你我在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.我的终端程序显示替换字符。我认为你的只会出现问号。