zipファイルのキリル文字ファイル名のエンコード

zipファイルのキリル文字ファイル名のエンコード

zipファイルのストリームとして保存されたファイル名の非ASCII文字に関連するいくつかの問題があります(ヘブライ人中国人日本語でも韓国語でも)。ただし、提供されているソリューションのどれも、Windowsコンピュータでキリル文字を含むzipファイルを処理するのに役立ちませんでした。

ファイル自体にはキリル文字名(コスモス.zip- ダウンロード可能なリンク)。これは説明目的でのみ長さ0のコンテンツのアーカイブです。

unzip -l印刷:

Archive:  Космос.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   ɫ���߼��/ict_inf.pdf
---------                     -------
        0                     1 file

Uglyはɫ���߼��一連のバイトを表しますC9 AB DF E8 AB DF BC AB DF

私は(Gmailのプレビュー機能を使用して)これになる必要があることを知っています。

Archive:  Космос.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   РосКосмос/ict_inf.pdf
---------                     -------
        0                     1 file

これが私たちがマッピングしなければならないことC9 AB DF E8 AB DF BC AB DFですРосКосмос

一般的に使用される8ビットキリル文字エンコーディングには、CP1251、CP866、ISO8859-5などがありますが、これらはこの単語を別のバイトシーケンスにエンコードします。

           Р  о  с  К  о  с  м  о  с
CP866:     90 AE E1 8A AE E1 AC AE E1
CP1251:    D0 EE F1 CA EE F1 EC EE F1
ISO8859-5: C0 DE E1 BA DE E1 DC DE E1

明らかに、一般的に使用される8ビットキリル文字エンコーディングのどれも、入力名をそのような出力名にデコードしません。これにはもっと複雑なことがあります。

find名前をデコードする方法がわかっている場合は、適切なスクリプト(https://unix.stackexchange.com/a/252000/17649)、例えば

find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | here-goes-the-decoding pipeline )"' sh {} \;

またはコンバージョン率便利です。

ベストアンサー1

私は1996年以来、オープンソースのソフトウェアと技術を専門的に扱う人気のあるロシアのリソースであるOpenNET.ruフォーラムでソリューションを見つけました。OpenNETに公開Info-ZIPは、かつてMS-DOSを実行しているコンピュータでZIPアーカイブを処理するために広く使用されているツールでした。 MS-DOS には CP850 という 1 つの 8 ビットエンコーディングしかないため、すべてのファイル名が自動的にCP850->CP1252変換されました。 CP1252は、おそらくISO-8859-1文字セットの最も広く使用されているエンコード近似として選択されます。

したがって、キリル文字ファイル名を含むアーカイブを抽出した後に実行する正しい find コマンドは、次のようになります。

find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp1252 -t cp850 | iconv -f cp866 )"' sh {} \;

興味深いことに、CP1252を使用せずにISO-8859-1を使用することをお勧めします。iconv -f iso8859-1 -t cp850変換は成功したが変換が失敗したアーカイブの一部に会ったため、これは本当ではないようですiconv -f cp1252 -t cp850

単一の役割に戻る

           Р  о  с  К  о  с  м  о  с
CP866:     90 AE E1 8A AE E1 AC AE E1

CP850 - > CP1252を適用すると、結果はC9 AB DF E8 AB DF BC AB DF私たちが観察した順序と正確に一致します。

もう一つの便利なコマンドは

 unzip -l РосКосмос.zip | grep -aEv '^Archive:' | iconv -f iso8859-1 -t cp850 | iconv -f cp866

アーカイブからファイルリストをインポートする

 Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   РосКосмос/ict_inf.pdf
---------                     -------
        0                     1 file

次に始まる行をフィルタリングするArchive:ことは、アーカイブ名を変換から隠すための保護措置です。

おすすめ記事