web-dev-qa-db-ja.com

不明な8ビットファイルをutf8に変換する方法

UbuntuのgEditで開くと、意味不明に表示される.srtファイルがあります。だから私はそれをutf8に変換してそれを読めるようにしたいと思っています。

それが与えるエンコーディングを理解しようとすると:

file -i x.srt 
x.srt: text/plain; charset=unknown-8bit

別の試みで私は見つけました:

find .  -type f -print | xargs file
./x.srt:   Non-ISO extended-ASCII text, with CRLF line terminators

また私は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.

そして

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.

だから私はエンコーディングを知って、最終的にそれを使用可能なフォーマットに変換する方法を考えています。

7
supermario

未知のエンコーディングから既知のエンコーディングに変換する確実な方法はありません。

あなたの場合、元のテキストがペルシア語/ペルシア語であることがわかっている場合は、いくつかの可能なエンコーディングを識別し、期待する出力が表示されるまでそれらを反復できます。

迅速なグーグルに基づいて、レガシー Iran System encoding 用の標準の安定したコンバーターはなく、唯一残っている一般的な代替物は Windows codepage 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

(私のバージョンのiconvは実際にはMacArabicをサポートしていませんが、運が良ければ、別の変換ツールを試すことができます。)

結果の出力ファイルを調べます。それらの1つが意味を成しているかどうかを確認します。

出力がどのように見えるかがわかっている場合は、ファイル内のバイトの個々のマッピングを検索することもできます。最初のバイトが0x94であり、それがasとして表示されることがわかっている場合は、基本的にエンコーディングがイランシステムであることを確認しました。たぶん、この結論を確認するためにさらに数バイトを調べます。このエンコーディングのWikipediaページには、すべての文字の表があります。明らかに、これには多くの候補となるエンコーディングが選択されている場合は特に、これは骨の折れる作業で、時間がかかり、エラーが発生しやすくなります。

一部のエンコーディングについては、リストを見つけることができます。 https://tripleee.github.io/8bit/ -他の人にとっては、対応するWikipediaのコーディングテーブルを参照する必要があるだけかもしれません。

4
tripleee

不明な8ビットコードページ内のファイルは、「不明な8ビット」と判断されます。理由は次のとおりです。言語についての考えがなければ、簡単な問題ではありません。不可能ではありませんが、効率的に機能するために、このようなヒューリスティック検出器は、最もよく使用されるすべての言語の大きな語彙、コードページの大きなリスト、およびいくつかの文法を知っていなければなりませんでした。更新:試したことがない enca ;おそらくそれは、これらの線に沿って作られた不思議なデコーダでしょう。しかし、ファイルがたとえばASCII高ビットセットのオクテットで構成される1つまたは2つの単語のみのソースコードを表す場合、そのような言語でも言語とエンコーディングを推測することは事実上不可能です。奇跡的なヒューリスティックアルゴリズムです。そのため、元のHTTP/1.1はHTTPでの文字セットの宣言を強く主張していましたContent-Type:ヘッダーtext/* メディアタイプ。

したがって、ポイントごとの解決策:

  1. ファイルがエンコードすると思われる言語を調査/学習/推測します。ここでは人間の知性が重要です。少なくともいくつかのもっともらしい仮説のリストを作成します。
  2. 言語で使用されているエンコーディングのリストをコンパイルします。
  3. 次のエンコードを試してください:headfile|iconv -ftry(使用するTUIに応じてLANG環境変数が設定されていると想定)、成功するまで結果が読み取り可能かどうかを確認します。

もちろん、このソリューションは、テキストが正しくエンコードされているが、unknownコードページ。人為的なミスやソフトウェアの不具合によりテキストが文字化けした場合は、この方法では解決できません。

ポイント2.と3.は自動化でき、そのようなツールは確かに存在しますが、それらは言語固有です(つまり、ロシア語のヒューリスティックデコーダーは日本語では機能せず、逆も同様です)、または少なくとも、入力言語を指定します( enca と同様)。

ペルシア語については、可能なエンコーディングには、Windows-1256( this thread を参照)、ISO 8859-6、および廃止された Iran System encoding が含まれます。ここで、ロシア語(KOI7、KOI8、CP866、Windows-1251、ISO 8859-5、MacCyrillic、MIK)に使用される7つ以上のコードページのリストがないことにご注意ください。

2
Incnis Mrsi

おそらく、それぞれの最初の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

...そして、どの形式が適切かを調べます(ペルシア語を認識できる場合)。

1
Asain Kujovic