簡體   English   中英

日文SRT文件出現亂碼,無法確定使用iconv修復的編碼

[英]Japanese SRT files garbled, can't determine encoding to fix with iconv

我有一個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

您所擁有的是一個已從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
Θα σε σκοτώσω, Γουάιντζελστιν!

英文翻譯是“ 我會殺了你,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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM