从 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)

简而言之:文本文件没有文本方向的信息,它只是一个文本文件。

比照。 https://www.w3.org/TR/WCAG-TECHS/H34.html

查看原始字幕文件,我可以确定它格式不正确。即使以从左到右的字符集显示,句点似乎也出现在文本之前。不过,我相信正确的字符集是 windows-1256。

正确显示的唯一方法是行首的标点符号显示为 LTR,而该行的其余部分显示为 RTL。您可以尝试通过在标点符号之后添加一个 UTF-8 从左到右的标记来强制执行此操作。

如果您更愿意修复原始文件,则需要将所有标点符号从行首移动到末尾。行首的括号也需要反转。