在 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 个字节。我的终端程序显示替换字符。我认为你的只是显示问号。
我正在我的 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 个字节。我的终端程序显示替换字符。我认为你的只是显示问号。