如何将未知 8 位文件转换为 utf8

sup*_*rio 10 character-encoding unicode

我有一个 .srt 文件,当我在 ubuntu 的 gEdit 中打开它时显示为乱码。所以我想将它转换为utf8以便能够阅读它。

当我试图弄清楚它给出的编码时:

file -i x.srt 
x.srt: text/plain; charset=unknown-8bit
Run Code Online (Sandbox Code Playgroud)

在另一次尝试中,我发现:

find .  -type f -print | xargs file
./x.srt:   Non-ISO extended-ASCII text, with CRLF line terminators
Run Code Online (Sandbox Code Playgroud)

我也试过 enca:

enca x.srt 
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.
Run Code Online (Sandbox Code Playgroud)

enca -L Persian  x.srt 
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.
Run Code Online (Sandbox Code Playgroud)

所以我想知道如何知道编码并最终将其转换为可用格式。

tri*_*eee 6

没有可靠的方法可以将未知编码转换为已知编码。

在您的情况下,如果您知道原始文本是波斯语/波斯语,也许您可​​以识别许多可能的编码,并迭代这些编码,直到看到您期望的输出。

基于快速谷歌搜索,没有用于传统伊朗系统编码的标准、稳定的转换器,唯一剩下的流行替代方案是Windows 代码页 1256。我在此处包含MacArabic主要是为了说明目的(尽管它甚至可能是波斯语的可行替代方案?)

for encoding in cp1256 macarabic; do
    if iconv -f "$encoding" -t utf-8 inputfile >outputfile."$encoding"; then
        echo "$encoding: possible"
    else
        echo "$encoding: skipped"
        rm outputfile."$encoding"
    fi
done
Run Code Online (Sandbox Code Playgroud)

(我的版本iconv实际上并不支持 MacArabic,但也许你会更幸运;或者你可以尝试不同的转换工具。)

检查生成的输出文件;看看其中一个是否有意义。

如果您知道输出应该是什么样子,您还可以在文件中查找各个字节的映射。如果第一个字节是 0x94 并且您知道它应该显示为 ? 您已经基本确定编码是伊朗系统。也许再查几个字节来验证这个结论。这种编码的维基百科页面有一个包含所有字符的表格。显然,这很费力、很慢,而且容易出错,尤其是在有很多候选编码可供选择的情况下。

对于某些编码,您可以找到一个列表,例如https://tripleee.github.io/8bit/——对于其他编码,您可能只需要查看相应的 Wikipedia 编码表。


Asa*_*vic 1

也许可以通过列出每个的前 20 行来直观地检查 iconv 的所有 ~1000 种可能性...合并到 all.txt 结果中。

#!/usr/bin/env bash
                      line=$(printf "=%.0s" {1..50})
for FMT in $(iconv -l); do    
                   echo "$line\nFormat $FMT:\n$line"
   iconv -f $FMT -t UTF8 < inputFile.srt | head -n20
done > all.txt

#gedit all.txt
Run Code Online (Sandbox Code Playgroud)

...并找出哪种格式是正确的(如果您能识别波斯语)。