从 windows-1256 转换为 UTF-8 会导致标点问题
Converting from windows-1256 to UTF-8 causes punctuation issue
我有一个阿拉伯语字幕,我正在尝试将其从 SRT 转换为 VTT。根据 ICU (Java) 上的字符编码检测器,字幕似乎正在使用 windows-1256。最终的 VTT 文件是 UTF-8。
字幕转换得很好,除了标点符号从左侧移动到右侧外,一切看起来都是正确的。我在 Chromecast 上使用这个字幕,所以起初我认为这是 Chromecast 的问题,但甚至 Linux 上的 gedit 也有问题。但是 LibreOffice 没有这个问题。 IntelliJ 上的控制台也没有输出。
我写了一段简单的代码来重现问题,而没有实际从 SRT 转换为 VTT,只是通过从 windows-1256 转换为 UTF-8。
BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream("arabic sub.srt"), "windows-1256")
);
String line = null;
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("bad punctuation.srt"), "UTF-8")
);
while((line = reader.readLine())!= null){
System.out.println(line);
writer.write(line);
writer.write("\r\n");
}
writer.close();
reader = new BufferedReader(
new InputStreamReader(new FileInputStream("bad punctuation.srt"), "UTF-8")
);
line = null;
while((line = reader.readLine())!= null){
System.out.println(line);
}
这是 IntelliJ 控制台的输出:
如您所见,点在左侧,我猜是正确的。
这是 gedit 显示的内容:
大部分文字都在右边,我猜是正确的,但句点在右边,我猜是错误的。
这是 LibreOffice:
大部分是正确的,标点符号在左边,但是文字也在左边,我想应该在右边。
这是我正在测试的字幕https://www.opensubtitles.org/en/subtitles/5168225/game-of-thrones-fire-and-blood-ar
我还尝试了另一种最初编码为 UTF-8 的 SRT,它运行良好,没有问题。所以我的猜测是 windows-1256 的转换是问题所在。
那么我重新编码文件的方式有什么问题?
谢谢。
编辑:忘记了 chromecast 图片。
如您所见,标点符号用错了。
编辑:我刚刚注意到 Linux chardet
说它是 MacCyrillic
而不是 windows-1256
。但是 Java ICU 库说 windows-1256
。无论如何,如果我使用 MacCyrillic
那么标点符号在 gEdit 上看起来不错,但文本本身看起来不正确,就像它现在使用垃圾字符一样。
由于编码与文本方向(LTR 与 RTL)无关,我认为您应该利用专门为此目的创建的 UTF-8 标记。
- 从左到右的标记: 或 (U+200E)
- 从右到左标记: 或 (U+200F)
简而言之:文本文件没有文本方向的信息,它只是一个文本文件。
查看原始字幕文件,我可以确定它格式不正确。即使以从左到右的字符集显示,句点似乎也出现在文本之前。不过,我相信正确的字符集是 windows-1256。
正确显示的唯一方法是行首的标点符号显示为 LTR,而该行的其余部分显示为 RTL。您可以尝试通过在标点符号之后添加一个 UTF-8 从左到右的标记来强制执行此操作。
如果您更愿意修复原始文件,则需要将所有标点符号从行首移动到末尾。行首的括号也需要反转。
我有一个阿拉伯语字幕,我正在尝试将其从 SRT 转换为 VTT。根据 ICU (Java) 上的字符编码检测器,字幕似乎正在使用 windows-1256。最终的 VTT 文件是 UTF-8。
字幕转换得很好,除了标点符号从左侧移动到右侧外,一切看起来都是正确的。我在 Chromecast 上使用这个字幕,所以起初我认为这是 Chromecast 的问题,但甚至 Linux 上的 gedit 也有问题。但是 LibreOffice 没有这个问题。 IntelliJ 上的控制台也没有输出。
我写了一段简单的代码来重现问题,而没有实际从 SRT 转换为 VTT,只是通过从 windows-1256 转换为 UTF-8。
BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream("arabic sub.srt"), "windows-1256")
);
String line = null;
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("bad punctuation.srt"), "UTF-8")
);
while((line = reader.readLine())!= null){
System.out.println(line);
writer.write(line);
writer.write("\r\n");
}
writer.close();
reader = new BufferedReader(
new InputStreamReader(new FileInputStream("bad punctuation.srt"), "UTF-8")
);
line = null;
while((line = reader.readLine())!= null){
System.out.println(line);
}
这是 IntelliJ 控制台的输出:
如您所见,点在左侧,我猜是正确的。
这是 gedit 显示的内容:
大部分文字都在右边,我猜是正确的,但句点在右边,我猜是错误的。
这是 LibreOffice:
大部分是正确的,标点符号在左边,但是文字也在左边,我想应该在右边。
这是我正在测试的字幕https://www.opensubtitles.org/en/subtitles/5168225/game-of-thrones-fire-and-blood-ar
我还尝试了另一种最初编码为 UTF-8 的 SRT,它运行良好,没有问题。所以我的猜测是 windows-1256 的转换是问题所在。
那么我重新编码文件的方式有什么问题?
谢谢。
编辑:忘记了 chromecast 图片。
如您所见,标点符号用错了。
编辑:我刚刚注意到 Linux chardet
说它是 MacCyrillic
而不是 windows-1256
。但是 Java ICU 库说 windows-1256
。无论如何,如果我使用 MacCyrillic
那么标点符号在 gEdit 上看起来不错,但文本本身看起来不正确,就像它现在使用垃圾字符一样。
由于编码与文本方向(LTR 与 RTL)无关,我认为您应该利用专门为此目的创建的 UTF-8 标记。
- 从左到右的标记: 或 (U+200E)
- 从右到左标记: 或 (U+200F)
简而言之:文本文件没有文本方向的信息,它只是一个文本文件。
查看原始字幕文件,我可以确定它格式不正确。即使以从左到右的字符集显示,句点似乎也出现在文本之前。不过,我相信正确的字符集是 windows-1256。
正确显示的唯一方法是行首的标点符号显示为 LTR,而该行的其余部分显示为 RTL。您可以尝试通过在标点符号之后添加一个 UTF-8 从左到右的标记来强制执行此操作。
如果您更愿意修复原始文件,则需要将所有标点符号从行首移动到末尾。行首的括号也需要反转。