文件io—具有utf字符的java io

368yc8dk  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(731)

我对文件有个奇怪的问题。
我打算修改一个 .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();
    }
}

这是原始文件中的图像:

但是,结果文件如下所示:

我寻找了很多解决办法,但都没有成功。请帮忙。

ahy6op9u

ahy6op9u1#

首先有几点:
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。

相关问题