我在我的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的转换。
提前致谢。
答案 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.我的终端程序显示替换字符。我认为你的只会出现问号。