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

不明な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.

だから、エンコーディングを知り、最終的に利用可能な形式に変換する方法を知りたいです。

答え1

未知のエンコーディングを既知のエンコーディングに変換する安定した方法はありません。

あなたの場合、元のテキストがペルシャ語/ペルシャ語であることがわかっている場合は、可能なエンコード数を識別し、必要な出力が表示されるまでこれを繰り返すことができます。

クイックGoogle検索の結果標準的で信頼性の高いレガシーコンバータはありません。イランシステムエンコーディング、残りの唯一の普及した代わりはWindowsコードページ1256。私は含んでいたアラビアの馬主に説明の目的でここにあります(Farsiの実行可能な代替手段になるかもしれませんが)。

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であり、ﭖで読み取る必要があることがわかっている場合は、基本的にエンコードがイランシステム用であると判断したものです。この結論を確認するために、さらに数バイトをチェックしてください。このエンコーディングのWikipediaページには、すべての文字を含む表があります。明らかに、これは難しく、遅く、エラーが発生しやすいプロセスです。特に選択候補符号化が多い場合にはさらにそうである。

一部のエンコーディングでは、次のリストがあります。https://tripleee.github.io/8bit/- それ以外の場合は、Wikipediaのコーディングテーブルを見てください。

答え2

不明な8ビットコードページのファイルが「不明な8ビット」として識別される理由があります。言語の知識がなければ、これは単純な問題ではありません。不可能とは言えませんが、効果的に機能するには、これらのヒューリスティック検出器が最も一般的に使用されるすべての言語の膨大な語彙、大規模なコードページのリストを保持し、いくつかの構文を知る必要があります。アップデート:試したことがないenca;多分これはこのようなコンテキストで作られた魔法のデコーダかもしれません。ただし、ファイルがほとんどのASCIIソースコードを表し、親オクテットで構成される1つまたは2つの単語のみが含まれている場合、これらの魔法の経験的方法を使用しても言語とエンコードを推測することは事実上不可能です。これは、もともとHTTP / 1.1がContent-Type:すべてのメディアタイプに対してHTTPヘッダーにtext/文字セットを宣言する必要があると強く主張した理由です。

したがって、ソリューションは次の点に分けられます。

  1. ファイルをどの言語にエンコードする必要があるかを調査/学習/推測します。ここでは人間の知恵が重要です。少なくともいくつかのもっともらしい仮定をリストします。
  2. コンパイルされた言語で使用されるエンコーディングのリスト。
  3. 次のエンコーディングを試してください。head文書 |iconv -f努力する(使用されているTUIに従ってLANG環境変数が設定されていると仮定します)成功するまで結果を読み取ることができることを確認してください。

もちろん、このソリューションはテキストがエンコードされていると仮定します。適切にしかし、未知コードページ。人の間違いやソフトウェアの欠陥によってテキストが歪む状況は、この方法では解決できません。

ポイント2と3は自動化することができ、そのようなツールが存在しますが、言語によって異なる(またはロシア語の経験的デコーダが日本語では機能せず、その逆も同様)、少なくとも入力言語を指定する必要があります(例:encaする)。

ペルシャ語の場合、可能なエンコードにはWindows-1256が含まれます(参照:このスレッド)、ISO 8859-6、現在廃止イランシステムエンコーディング。幸いなことに、ロシア語(KOI7、KOI8、CP866、Windows-1251、ISO 8859-5、MacCyrillic、MIK)の少なくとも7つのコードページのリストはありません。

答え3

おそらく、all.txtの結果にマージされたそれぞれの最初の20行を一覧表示することで、iconvの約1000の可能性をすべて視覚的に確認できます。

#!/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

...そして、どの形式が正しいかを調べてください(ペルシャ語を認識できる場合)。

関連情報