Windows⇔Linux間での zip ファイルの文字化けを解決する(zip,unzip,7za)

こんにちは。サイオステクノロジー OSS サポート担当何敏欽です。

業務では Windows ⇔ Linux 間でデータのやりとりをすることが良くあります。でも、Windows で圧縮されたファイルを Linux 上で解凍、またはその逆の場合も、文字化けを起こしてしまって困った経験をされた方も多いのではないでしょうか?

そんなときの解決方法をご紹介します。

Windows → Linux 文字化け回避する方法

Windows (Shift_JIS) でファイル名に日本語が含まれる zip ファイルを作成し、 Linux (UTF-8) において unzip コマンドで解凍する場合、下記のように「-O」 オプションを使用することで、文字コードを変換して解凍することができます。

# ls -il
16971791 -rw-r--r--. 1 root root  338  4月 27 16:06 ???{???t?@?C??.zip
# unzip -O sjis ???{???t?@?C??.zip
Archive:  凞
            褪@C
                .zip
   creating: 日本語ファイル/
 extracting: 日本語ファイル/文字化け.txt

「-O」オプションは、 RHEL 同梱版の unzip では unzip-6.0-3.el6 (RHEL6)、unzip-6.0-16.el7 (RHEL7) 以降でサポートされます。

Linux → Windows 文字化け回避する方法

RHEL 同梱版の zip なら、unzip と同様に便利なオプションが用意されていると思いましたが、残念ながら、zip コマンドは圧縮した時点でファイル名の文字コードを変換する方法はありません。

そのため、Linux で zip コマンドでファイル名に日本語が含まれる zip ファイルを作成し、Windows で解凍する場合では、下記のように、任意のディレクトリにて、まず convmv コマンド (# yum install convmv で導入) を使用して圧縮したいファイルの文字コードを変換してから、zip コマンドでディレクトリ名を指定して圧縮することで、文字化けを起こさずに解凍することができます。

# mkdir /tmp/hoge
# cd /tmp/hoge/
# convmv -r -f utf8 -t sjis hoge --notest
Ready!
# zip -r /tmp/hoge.zip .
  adding: hoge (stored 0%)

p7zip パッケージをインストールしてみる

zip で用いられる暗号アルゴリズムは、zipcrypto と呼ばれるものです。zipcrypto は強度的に問題があり、パスワードは英数小文字のみ、8桁の構成は 1秒以下で解析できたり、従来言われてきたパスワードは 4種類 93字の組み合わせ、8桁の構成でも 2週間ですべての組み合わせが解析できてしまいます。

RHEL 同梱版の zip、unzip コマンドでは使用される暗号化アルゴリズムは zipcrypto のみで、AES256 等の他の強力な暗号アルゴリズムをサポートしていないため使用できません。より強度の強い AES256 暗号化形式でパスワード付 zipファイルを作成するには p7zip パッケージが必要です。しかしながら、p7zip パッケージは RHEL では提供、およびサポートされておらず、EPEL リポジトリをインストールしてから p7zip パッケージをインストールする必要があります。

# rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm を取得中
警告: /var/tmp/rpm-tmp.Uzrx9V: ヘッダー V3 RSA/SHA256 Signature、鍵 ID 352c64e5: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:epel-release-7-11                ################################# [100%]
# yum -y install p7zip
読み込んだプラグイン:langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ p7zip.x86_64 0:16.02-10.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました
(省略)
インストール:
  p7zip.x86_64 0:16.02-10.el7

完了しました!

7za コマンドを使ってみる

AES256 暗号化形式でパスワード付 zip ファイル、以下のように「-mem=AES256」を指定して実行します。

「-m」オプションは圧縮方法を設定するもので、空白を入れずに、「em」を「AES256」に指定するという意味になります。「-m」オプションについて、ココを確認してください。

# 7za a -tzip -pMYPASSWORD -mem=AES256 hoge.zip

7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz (206D7),ASM,AES-NI)

Open archiv: hoge.zip
--
Path = hoge.zip
Type = zip
Physical Size = 10702

Scanning the drive:
13 folders, 20 files, 25069 bytes (25 KiB)

Updating archive: hoge.zip

Items to compress: 33


Files read from disk: 20
Archive size: 17831 bytes (18 KiB)
Everything is Ok

また、以下のようにパスワードなしで -p パラメータを指定することで、パスワードを入力するよう求められます。こちらの方法は、スクリーン上にパスワードを表示しないため、より安全であると考えられます。

# 7za a -tzip -p -mem=AES256 hoge.zip

7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz (206D7),ASM,AES-NI)

Open archive: hoge.zip
--
Path = hoge.zip
Type = zip
Physical Size = 298

Scanning the drive:
13 folders, 19 files, 14621 bytes (15 KiB)

Updating archive: hoge.zip

Items to compress: 32


Enter password (will not be echoed):
Verify password (will not be echoed) :

Files read from disk: 19
Archive size: 10702 bytes (11 KiB)
Everything is Ok

解凍するには、「x」オプション指定して実行する場合、圧縮時のディレクトリ構成をそのまま解凍します。「e」オプションを指定する場合、圧縮時のディレクトリ構成を無視して解凍します。

# 7za x hoge.zip

7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz (206D7),ASM,AES-NI)

Scanning the drive for archives:
1 file, 17253 bytes (17 KiB)

Extracting archive: hoge.zip
--
Path = hoge.zip
Type = zip
Physical Size = 17253
(省略)
ERROR: Wrong password : 文字化け.txt

Sub items Errors: 19

Archives with Errors: 1

Sub items Errors: 19

以上で zip、unzip コマンドを用いて zip ファイルの文字化けの解決方法や、7za コマンドを用いてより安全な暗号化形式の zip ファイルの作成 (圧縮・解凍する) 方法を説明しました。

Be the first to comment

コメント投稿

Your email address will not be published.


*