具有UTF字符的Java IO

具有UTF字符的Java IO,java,file-io,utf-8,Java,File Io,Utf 8,我对文件有个奇怪的问题 我打算修改.srt文件的计时,但编写新文件似乎是一项奇怪的任务 下面是我编写的示例代码: import java.io.*; import java.nio.charset.Charset; public class ReaderWriter { public static void main(String[] args) throws IOException { InputStream inputStream = new FileInputSt

我对文件有个奇怪的问题

我打算修改
.srt
文件的计时,但编写新文件似乎是一项奇怪的任务

下面是我编写的示例代码:

import java.io.*;
import java.nio.charset.Charset;

public class ReaderWriter {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("D:\\E\\Movies\\English\\1960's\\TheApartment1960.srt");
        Reader reader = new InputStreamReader(inputStream,
                Charset.forName("UTF-8"));
        OutputStream outputStream = new FileOutputStream("output.srt");
        Writer writer = new OutputStreamWriter(outputStream,
                Charset.forName("UTF-8"));

        int data = reader.read();
        while (data != -1) {
            char theChar = (char) data;
            writer.write(theChar);
            data = reader.read();
        }
        reader.close();
        writer.close();
    }
}
这是原始文件中的图像:

但是,生成的文件如下所示:

我寻找了很多解决办法,但都没有成功。请提供任何帮助。

首先有几点:

  • 您的Java代码没有问题。如果我使用它来读取包含UTF-8编码的阿拉伯语文本的输入文件,它将创建UTF-8编码的输出文件
  • 我认为没有字体问题。由于可以成功显示输入文件的内容,因此没有理由也不能成功显示有效输出文件的内容
  • 输出文件中带有问号的黑钻石是“用于替换输入字符,该字符的值在Unicode中未知或不可表示”。这表明您正在读取的输入文件不是UTF-8编码的,即使代码明确指出它是UTF-8编码的。如果输入文件是UTF-16编码的,但在代码中指定为UTF-8,我可以复制与您类似的结果
  • 或者,如果输入文件确实是UTF-8编码的,则在代码中将其指定为UTF-16。例如,这里是一个有效的UTF-8输入文件,其中包含一些阿拉伯语文本,其中代码(错误地)表示为
    Reader Reader=new InputStreamReader(inputStream,Charset.forName(“UTF-16”)

    从码码码中采集采集的码码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中,从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从代码>

    这是输出文件,包含替换字符,因为UTF-8文件的输入流被错误地处理为UTF-16:

    ���⃙臙訠���ꟙ蓙苘Ꟙꛙ藘ꤠ���諘께딠�����ꟙ蓘귘Ꟙ동裘꣙諘꧘谠����꫘뗙藙諙蔠���⃙裘ꟙ蓘귙裘돘꣘ꤠ���⃘ꟙ蓙蓘뫘Ꟙꨮ�

考虑到所有这些,只要确保在
InputStreamReader()
构造函数中正确指定输入文件的编码,就可以解决问题。要验证这一点,只需创建另一个输入文件并使用UTF-8字符编码保存它,然后运行代码。如果它能工作,那么您就知道问题在于输入文件的编码不是UTF-8。

首先有几点:

  • 您的Java代码没有问题。如果我使用它来读取包含UTF-8编码的阿拉伯语文本的输入文件,它将创建UTF-8编码的输出文件
  • 我认为没有字体问题。由于可以成功显示输入文件的内容,因此没有理由也不能成功显示有效输出文件的内容
  • 输出文件中带有问号的黑钻石是“用于替换输入字符,该字符的值在Unicode中未知或不可表示”。这表明您正在读取的输入文件不是UTF-8编码的,即使代码明确指出它是UTF-8编码的。如果输入文件是UTF-16编码的,但在代码中指定为UTF-8,我可以复制与您类似的结果
  • 或者,如果输入文件确实是UTF-8编码的,则在代码中将其指定为UTF-16。例如,这里是一个有效的UTF-8输入文件,其中包含一些阿拉伯语文本,其中代码(错误地)表示为
    Reader Reader=new InputStreamReader(inputStream,Charset.forName(“UTF-16”)

    从码码码中采集采集的码码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中采集采集的码中采集的码中采集的码中采集的码中采集的码中采集的码中,从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从代码>

    这是输出文件,包含替换字符,因为UTF-8文件的输入流被错误地处理为UTF-16:

    ���⃙臙訠���ꟙ蓙苘Ꟙꛙ藘ꤠ���諘께딠�����ꟙ蓘귘Ꟙ동裘꣙諘꧘谠����꫘뗙藙諙蔠���⃙裘ꟙ蓘귙裘돘꣘ꤠ���⃘ꟙ蓙蓘뫘Ꟙꨮ�


考虑到所有这些,只要确保在
InputStreamReader()
构造函数中正确指定输入文件的编码,就可以解决问题。要验证这一点,只需创建另一个输入文件并使用UTF-8字符编码保存它,然后运行代码。如果它起作用,那么您知道问题在于输入文件的编码不是UTF-8。

您如何查看输出?用记事本++或类似的东西?这可能是字体问题吗?@JGFMK它在IntelliJ IDEA中。但是,我用记事本++打开了它,结果是一样的。可能是原来的版本不是UTF-8吗也许是其他角色@JGFMK如何选择正确的编码?您如何查看输出?用记事本++或类似的东西?这可能是字体问题吗?@JGFMK它在IntelliJ IDEA中。但是,我用记事本++打开了它,结果是一样的。可能是原来的版本不是UTF-8吗也许是其他角色@JGFMK如何选择正确的编码?