【问题标题】:Japanese SRT files garbled, can't determine encoding to fix with iconv日文 SRT 文件乱码,无法确定要使用 iconv 修复的编码
【发布时间】:2014-10-18 09:45:06
【问题描述】:

我有一个 srt 文件,摘录:

2
00:00:36,208 --> 00:00:39,667
Èá óå óêïôþóù, ÃïõÜéíôæåëóôéí!

3
00:00:57,917 --> 00:01:00,917
Ãéáôß ôñÝ÷åéò, ÃïõÜéíôæåëóôéí;
Óïõ ðÞñá äþñï ãåíåèëßùí.

4
00:01:00,958 --> 00:01:03,208
Äåí ðåéñÜæåé, äåí ÷ñåéáæüôáí
íá ìïõ ðÜñåéò êÜôé.

5
00:01:03,250 --> 00:01:06,375
Óïõ ðÞñá ëßãï êïñìü äÝíôñïõ.
Êáé èá ôï öáò.

6
00:01:06,417 --> 00:01:08,875
Ùñáßá. ¸ôóé êé áëëéþò
èá Ýôñùãá êïñìü.

7
00:01:08,917 --> 00:01:10,208
Äåí èá Ýôñùãåò.

8
00:01:10,208 --> 00:01:11,000
Íáé. ÂëÝðåéò...

9
00:01:11,000 --> 00:01:12,417
...üëá ôá ðñÜãìáôá ðïõ Þèåëåò
íá ìïõ êÜíåéò...

10
00:01:12,417 --> 00:01:13,958
...ó÷åäßáæá íá ôá êÜíù ìüíïò ìïõ.

据说这些是日文字幕,但显然是编码问题造成的乱码。我试图弄清楚如何纠正它并最终转换为 UTF-8。有人有什么想法吗?

文件输出:UTF-8 Unicode(带 BOM)文本,带 CRLF 行终止符

可在此处获取文件进行测试: http://www.opensubtitles.org/en/subtitles/5040215/the-incredible-burt-wonderstone-ja

【问题讨论】:

    标签: utf-8 character-encoding iconv mojibake srt


    【解决方案1】:

    您所拥有的是一个已从ISO-8859-1 字符集转码为UTF-8 编码方案的文档,但文档源是在ISO-8859-7 字符集中编码的。转码为 UTF-8 后,增加了一个 U+FEFF 字节序标记(BOM)和几个引号(U+201C、U+201D)。

    语言是希腊语,修正后的第二个字幕序列是:

    2
    00:00:36,208 --> 00:00:39,667
    Θα σε σκοτώσω, Γουάιντζελστιν!
    

    英文翻译为“I'll kill you, Gouaintzelstin!”。

    扭转/纠正它:

    1. 从 UTF-8 编码方案解码文档
    2. 删除所有大于 U+00FF 的代码点
    3. 使用 ISO-8859-1 编码对文档进行编码
    4. 将使用 ISO-8859-7 编码的文档转码为 UTF-8 编码方案。

    上述在 Perl 中的实现:

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use Encode qw[];
    
    (@ARGV == 1 && -f $ARGV[0])
      or die qq[Usage: $0 <file>];
    
    my $file = shift @ARGV;
    
    my ($octets, $string);
    
    # Read all the octets from the file
    $octets = do {
        open my $fh, '<:raw', $file
          or die qq[Could not open '$file' for reading: '$!'];
        local $/; <$fh>
    };
    
    # Decode the octets using the UTF-8 encoding scheme
    $string = Encode::decode('UTF-8', $octets, Encode::FB_CROAK);
    
    # Remove all code points greater than U+00FF
    $string =~ s/[^\x00-\xFF]//g; 
    
    # Encode the string using the ISO-8859-1 encoding
    $octets = Encode::encode('ISO-8859-1', $string);
    
    # Decode the octets using the ISO-8859-7 encoding
    $string = Encode::decode('ISO-8859-7', $octets);
    
    # Encode the string using the UTF-8 encoding
    $octets = Encode::encode('UTF-8', $string);
    
    # Output the octets on standard output
    print $octets;
    

    【讨论】:

    • 对那个chansen的侦查非常好!太糟糕了,该文件不是标记为日语的,但这与此无关。我确实尝试了这个脚本,最终得到了一个完美编码的希腊 srt 文件。
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多