アーカイブで「7z x」を実行すると、
'20ª.1¯® '$'\302 \212''¨à®¢®£à¤áªïã".rtf 'IMG_6527.JPG' '$'\302 \212''¨à®¢®£ à¤áªï、¨áâ.doc 'IMG_6532.JPG' '$'\302 \204''®¯á®£"è\¨\(3).doc 'IMG_6542.JPG' '$'\302\204\302\212\302\217 ''。doc 'IMG_6543.JPG IMG_6526.JPG
明らかに一部のファイルは異なる方法でエンコードされており、7zはデフォルトではutf8に変換されません。 7zに変換を指示する方法は?
Charsetで見つけた唯一のオプション:
-scc {UTF-8 | WIN | DOS}:コンソール入出力用の文字セットを設定します
-scs {UTF-8 | UTF-16LE | UTF-16BE | WIN | DOS | {id}}:リストファイルの文字セットを設定
WIN、DOS、UTF-8は機能しません。文字セット '7z -scsCP1251 l 26-08-2016_10-18-14.Zip' 7zを推測しようとすると、警告が表示されます。
サポートされていない文字セット:cp1251
unzipはこれを正しく行います(キリル文字が変換されます):
'20 к.1 по Кировоградская ул.rtf' IMG_6532.JPG 'Доп соглашение(3).doc'
26-08-2016_10-18-14.Zip IMG_6542.JPG 'Кировоградская, ист.doc'
IMG_6526.JPG IMG_6543.JPG
IMG_6527.JPG ДКП.doc
p7Zipバージョン15.14.1(locale = ru_RU.UTF-8、Utf16 = on、HugeFiles = on、64ビット、4 CPU AMD Phenom(tm)II X4 960Tプロセッサー(100FA0)、ASM)
アーカイブ開始の16進ダンプ(od -tx1z -Ax
):
000000 50 4b 03 04 14 00 00 00 00 00 81 54 1a 49 7e 35 >PK.........T.I~5<
000010 fa 34 00 ec 00 00 00 ec 00 00 07 00 17 00 84 8a >.4..............<
000020 8f 2e 64 6f 63 75 70 13 00 01 19 fd 45 54 d0 94 >..docup.....ET..<
000030 d0 9a d0 9f 2e 64 6f 63 00 00 00 00 d0 cf 11 e0 >.....doc........<
000040 a1 b1 1a e1 00 00 00 00 00 00 00 00 00 00 00 00 >................<
000050 00 00 00 00 3e 00 03 00 fe ff 09 00 06 00 00 00 >....>...........<
000060 00 00 00 00 00 00 00 00 01 00 00 00 71 00 00 00 >............q...<
000070 00 00 00 00 00 10 00 00 73 00 00 00 01 00 00 00 >........s.......<
000080 fe ff ff ff 00 00 00 00 70 00 00 00 ff ff ff ff >........p.......<
000090 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff >................<
*
000230 ff ff ff ff ff ff ff ff ff ff ff ff ec a5 c1 00 >................<
000240 07 80 19 04 00 00 f0 12 bf 00 00 00 00 00 00 10 >................<
000250 00 00 00 00 00 08 00 00 72 7b 00 00 0e 00 62 6a >........r{....bj<
000260 62 6a 2a 16 2a 16 00 00 00 00 00 00 00 00 00 00 >bj*.*...........<
000270 00 00 00 00 00 00 00 00 19 04 16 00 34 8e 00 00 >............4...<
000280 48 7c 00 00 48 7c 00 00 4b 2c 00 00 00 00 00 00 >H|..H|..K,......<
000290 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<
0002a0 00 00 00 00 00 00 00 00 ff ff 0f 00 00 00 00 00 >................<
0002b0 00 00 00 00 ff ff 0f 00 00 00 00 00 00 00 00 00 >................<
0002c0 ff ff 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<
0002d0 00 00 00 00 b7 00 00 00 00 00 3e 0e 00 00 00 00 >..........>.....<
0002e0 00 00 3e 0e 00 00 a0 1b 00 00 00 00 00 00 a0 1b >..>.............<
0002f0 00 00 00 00 00 00 a0 1b 00 00 00 00 00 00 a0 1b >................<
000300 00 00 00 00 00 00 a0 1b 00 00 14 00 00 00 00 00 >................<
000310 00 00 00 00 00 00 ff ff ff ff 00 00 00 00 b4 1b >................<
000320 00 00 00 00 00 00 b4 1b 00 00 00 00 00 00 b4 1b >................<
000330 00 00 38 00 00 00 ec 1b 00 00 84 00 00 00 70 1c >..8...........p.<
000340 00 00 34 00 00 00 b4 1b 00 00 00 00 00 00 b8 28 >..4............(<
000350 00 00 e6 01 00 00 a4 1c 00 00 00 00 00 00 a4 1c >................<
000360 00 00 00 00 00 00 a4 1c 00 00 00 00 00 00 a4 1c >................<
000370 00 00 00 00 00 00 a4 1c 00 00 00 00 00 00 d8 1d >................<
000380 00 00 00 00 00 00 d8 1d 00 00 00 00 00 00 d8 1d >................<
000390 00 00 00 00 00 00 43 28 00 00 02 00 00 00 45 28 >......C(......E(<
0003a0 00 00 00 00 00 00 45 28 00 00 00 00 00 00 45 28 >......E(......E(<
*
0003c0 00 00 00 00 00 00 45 28 00 00 00 00 00 00 9e 2a >......E(.......*<
0003d0 00 00 a2 02 00 00 40 2d 00 00 da 00 00 00 45 28 >[email protected](<
0003e0 00 00 2d 00 00 00 00 00 00 00 00 00 00 00 00 00 >..-.............<
0003f0 00 00 00 00 00 00 a0 1b 00 00 00 00 00 00 d8 1d >................<
000400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<
000410 00 00 00 00 00 00 d8 1d 00 00 00 00 00 00 d8 1d >................<
000420
Zipファイルの作成に使用されるエンコーディングによっては、ロケールを一時的に "C"に設定することで、不要な翻訳を防ぐことができる場合があります。
LC_ALL=C 7z x $archive
(これは、Win7のIZArcが2つのサンプルファイル名を使用して作成したZipに役立ちました。)
ただし、問題のアーカイブの場合、「filename」フィールドには、「ДКП.doc」(84 8a 8f 2e 64 6f 63
)。 「追加」フィールドは、Info-Zip拡張機能( Zip仕様v 6.3.4 のセクション4.6.9を参照)を使用して、UTF-8ファイル名を格納します。 unzip
はこのヘッダーを認識しており、CP1251を無視してUTF-8名を使用します。
7z
は、この「追加フィールド」では何もせず、CP1251のみを使用します。現在のロケールによっては、その正確な名前(生のバイト84 8a 8f
)、またはさらに悪いことに、それらを最初にUTF-8に拡張されるUnicodeポイントとして扱います(c2 84 c2 8a c2 8f
)。
1つのオプションは、外部ユーティリティを使用して最初にZip
を変更することです。
#!/bin/bash
cp orig.Zip renamed.Zip
index=0
zipinfo -1 orig.Zip | while read name ; do
ziptool renamed.Zip rename $index "$name"
index=$((index+1))
done
ziptool
は libzip からです。 zipinfo
は Info-ZipのUnZip で配布されるため、unzip
を使用したばかりかもしれません。
p7Zip
の作者であるIgor Pavlovとのこのディスカッションスレッドをp7Zipのページで見つけました: LinuxでのOEM文字セットの問題 。これはこのQ&Aの双子です。この投稿はそれをすべて言います。
おそらく-mcpスイッチはp7Zipでは機能しません。ただし、-mcpは7-Zip(Windowsバージョン)で機能します。そのため、p7Zipで機能させる方法がわかりません。関数:CPP\Common\StringConvert.cpp内のRusting MultiByteToUnicodeString(const AString&srcString、UINT codePage)
日付は2016年4月18日です。 7月の最新のp7Zipリリースを確認しましたが、スイッチはまだありません。私はテストしなかったので、少なくともドキュメントでは。