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:ことは、アーカイブ名を変換から隠すための保護措置です。

答え2

「最近の」infozipで使用されたZIPファイルは正しいファイル名を表示します。

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

РосКосмос/そして、unzipは解凍時にディレクトリを正しく生成します。

infozipはずっと前にUTF-8サポートを追加しました。私のUbuntuで実行可能:

UnZip 6.00, 20 April 2009
Zip 3.0,  July 5th 2008

したがって、問題は以前のバージョンのInfoZip(またはUTF-8サポートなしでコンパイルされたバージョン)である可能性があります。

私のバージョンでは、strings /usr/bin/unzip | grep -A8 -B8 'UTF-8'何よりも次のものを生成します。

ZIP64_SUPPORT (archives using Zip64 for large files supported)
LARGE_FILE_SUPPORT (large files over 2 GiB supported)
other
UTF-8
UNICODE_SUPPORT [wide-chars, char coding: %s] (handle UTF-8 paths)
USE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)
USE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)

これはコンパイル/ビルドオプションに関連しているようです。

答え3

zipのこの問題は次のとおりです。安定最近はFar2lファイルとアーカイブマネージャ。 Far2lの以前のzip文字セット検出が正しく機能するためには、システム言語設定は、アーカイブが生成されたシステムで設定された言語設定と一致する必要があります(Windowsの内部「zipフォルダ」ツールは同じロジックを使用します)。あなたもできます。

LANG=ru_RU.UTF-8 far2l

答え4

バニラun​​zipとバニラp7zipの両方でOEMコードページの選択が中断されました。私は一つ作った修理するこの問題を解決し、Ubuntu用ppaこのパッチが適用されたp7zipを使用してください。

関連情報