我的文件有一个奇怪的问题。
我打算修改 .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 编码的输出文件。
- 我认为不存在字体问题。由于您可以成功显示输入文件的内容,因此您没有理由不能成功显示有效输出文件的内容。
- 输出文件中那些带有问号的黑色菱形是 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/