带有 UTF 字符的 Java IO

标签 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 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();
    }
}

这是原始文件中的图像: enter image description here

但是,结果文件看起来像: enter image description here

我寻找了很多解决方案,但徒劳无功。请提供任何帮助。

最佳答案

首先几点:

  • 您的 Java 代码没有任何问题。如果我用它来读取包含以 UTF-8 编码的阿拉伯文本的输入文件,它会毫无问题地创建以 UTF-8 编码的输出文件。
  • 我认为不存在字体问题。由于您可以成功显示输入文件的内容,因此您没有理由不能成功显示有效输出文件的内容。
  • 输出文件中那些带有问号的黑色菱形是 replacement characters它们“用于替换其值未知或无法用 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。

关于带有 UTF 字符的 Java IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60217002/

相关文章:

java - 从 GAE 应用程序内部写入 PDF

java - 如何在 JUNG 图中强制执行自定义布局?

java - 在 Wildfly 中托管多个虚拟主机/域

java - 使用 Struts 2 进行客户端验证时出现问题。无法识别基于 Xml 的验证规则

java - 将 JSON 文件写入 UTF-8 编码

php - 为什么 PHP 的 preg_split 在 “נ” 上拆分时将 UTF-8 中的希伯来字母 “\s” 拆分?

linux - Linux shell 和文件系统如何识别 Unicode?

java - 如何限制选中的复选框?

c - 用户输入.txt文件搜索C

java - 如何在 Java 中以编程方式创建 XML 文档?