このトラブルは、Linux(UTF-8環境)とWindows(Shift_JIS環境)のファイル名文字コードの違いから発生する。受け取ったZIPを開くたびに文字化けするのは、運用上なかなか地味なストレスになる。
この記事では、文字化けの原因を理解したうえで、unzip・unar・convmv を使った具体的な対処手順を解説する。RHEL 9.4 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みだ。
この記事のポイント
・WindowsのZIPはShift_JIS(CP932)でファイル名を保存するため、Linux展開時に文字化けする
・RHEL系では unzip -O CP932 でエンコーディングを指定して展開できる
・Ubuntu系は標準 unzip が -O を非サポート。unar コマンドで自動判定展開が最も手軽
・展開済みで文字化けしてしまった場合は convmv でファイル名を後から変換できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜLinuxでWindowsのZIPを展開すると文字化けするのか
ZIPフォーマットの仕様(PKWARE)では、ファイル名のエンコーディングは本来オプション扱いだった。古いWindowsの圧縮ツールはファイル名をShift_JIS(CP932)で保存していた。一方、Linux のunzip はデフォルトでシステムのロケール(通常UTF-8)を前提として展開する。CP932のバイト列をUTF-8として解釈するため、ファイル名が読めない文字の羅列になる。具体的にはこのような状態になる。
# CP932(Shift_JIS)で作成されたZIPをデフォルト設定で展開した場合 $ unzip windows_data.zip Archive: windows_data.zip inflating: ???_20240901.csv inflating: ???_??.xlsx
文字化けを確認する手順
1. unzip -lでZIPの中身を確認する
展開前にまずZIPの中身を確認しよう。unzip -l で一覧表示できる(ファイルの取り出しはしない)。# ZIPの内容一覧を確認(展開はしない) $ unzip -l windows_data.zip Archive: windows_data.zip Length Date Time Name --------- ---------- ----- ---- 4096 09-01-2024 12:00 ???_20240901.csv 2048 09-01-2024 12:01 ???_??.xlsx --------- ------- 6144 2 files
2. nkfでエンコーディングを推測する
nkf(文字コード変換ツール)を使うと、ファイル名のバイト列からエンコーディングを推測できる。# nkfのインストール # RHEL系: sudo dnf install nkf # Ubuntu: sudo apt install nkf # zipinfoとnkfを組み合わせてエンコーディングを判定 $ zipinfo -1 windows_data.zip | nkf --guess Shift_JIS
方法1: unzip -OでCP932指定して展開する(RHEL系推奨)
RHEL系ディストリビューション(RHEL9・Rocky Linux・AlmaLinux)のunzip パッケージは日本語対応パッチが当たっており、-O オプションでファイル名のエンコーディングを指定できる。1. 基本的な使い方
# -O でCP932(Shift_JIS)を指定して展開 $ unzip -O CP932 windows_data.zip -d /tmp/extracted/ Archive: windows_data.zip inflating: /tmp/extracted/受注一覧_20240901.csv inflating: /tmp/extracted/注文データ_9月.xlsx # 展開後の確認 $ ls /tmp/extracted/ 受注一覧_20240901.csv 注文データ_9月.xlsx
-d で展開先ディレクトリを指定するとカレントディレクトリを汚染せずに済む。・-O CP932:ファイル名のエンコーディングをCP932(Shift_JIS)として解釈する
・-d /tmp/extracted/:展開先のディレクトリを指定する(ない場合は自動作成)
2. -Oオプションが使えない場合(Ubuntu系)
Ubuntuの標準unzip は -O オプションをサポートしていない。実行するとエラーになる。# Ubuntu標準のunzipは -O を認識しない $ unzip -O CP932 windows_data.zip unzip: illegal option -- O
ファイル操作で詰まるのは「Linux基盤の理解」が抜けているサインかもしれません
文字コード・アーカイブ・パーミッションといったトラブルは、Linuxの動作原理を体系的に理解すれば自分で原因を特定して対処できるようになります。断片的なコマンド暗記より、現場で再現性のある判断力を身につける方が長期的に効率が高いです。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
方法2: unarコマンドで自動判定展開する(Ubuntu/Rocky両対応)
unar(The Unarchiver)は文字コードを自動判定して展開するコマンドだ。RHEL系・Ubuntu系の両方で利用でき、-O オプションが使えない環境での定番手段となっている。1. unarのインストール
# Ubuntu 24.04 / Debian $ sudo apt install unar # Rocky Linux 9 / AlmaLinux 9(EPELリポジトリを有効化後) $ sudo dnf install epel-release $ sudo dnf install unar # インストール確認 $ unar --version unar 1.10.7
2. unarで展開する
# unarで展開(エンコーディングは自動判定) $ unar windows_data.zip -o /tmp/extracted_unar/ windows_data.zip: ZIP 受注一覧_20240901.csv (4 KB)... OK. 注文データ_9月.xlsx (2 KB)... OK. Successfully extracted to "/tmp/extracted_unar/". # 結果を確認 $ ls /tmp/extracted_unar/windows_data/ 受注一覧_20240901.csv 注文データ_9月.xlsx
unar はファイル名のエンコーディングを自動で判定してくれる。特にエンコーディングを意識せずに展開できるのが利点だ。-o で展開先ディレクトリを指定できる。・-o /tmp/extracted_unar/:展開先を指定(デフォルトはカレントディレクトリ)
3. エンコーディングを明示指定したい場合
自動判定がうまくいかない場合は-e オプションでエンコーディングを明示できる。# エンコーディングを明示して展開(-e オプション) $ unar -e CP932 windows_data.zip -o /tmp/extracted_unar/
方法3: 展開済みのファイル名をconvmvで修正する
すでに文字化けした状態でZIPを展開してしまった場合でも、convmv(CONVert file names using iconv)でファイル名を後から修正できる。1. convmvのインストール
# Ubuntu 24.04 $ sudo apt install convmv # Rocky Linux 9 $ sudo dnf install convmv # インストール確認 $ convmv --version convmv 2.05
2. まず--dry-runで変換内容を確認する
実務上の注意点として、convmv は必ず --dry-run(または --notest の逆、デフォルトがdry-run相当)で変換前後のファイル名を確認してから本番実行すること。誤ったエンコーディング指定で余計に壊す失敗が多い。# まず --dry-run で変換前後のファイル名を確認(実際には変更しない) $ convmv -f shift_jis -t utf-8 -r --dry-run /tmp/extracted/ Starting a dry run without changes ... mv "./tmp/extracted/????????_20240901.csv" "./tmp/extracted/受注一覧_20240901.csv" mv "./tmp/extracted/??????_??.xlsx" "./tmp/extracted/注文データ_9月.xlsx" Ready! # 変換内容が正しいことを確認したら --notest で本番実行 $ convmv -f shift_jis -t utf-8 -r --notest /tmp/extracted/ mv "./tmp/extracted/????????_20240901.csv" "./tmp/extracted/受注一覧_20240901.csv" mv "./tmp/extracted/??????_??.xlsx" "./tmp/extracted/注文データ_9月.xlsx" Ready!
・-t utf-8:変換先の文字コード(UTF-8)
・-r:サブディレクトリを再帰的に処理
・--notest:実際にファイル名を変更する(指定なしはdry-run)
すでにUTF-8で正しくデコードされているファイルは
convmv がスキップしてくれるので、ディレクトリごとまとめて実行しても問題ない。「Bad CRC」「invalid zip file」エラーが出た時の切り分け
文字化けではなく「Bad CRC」エラーが出る場合は、ZIPファイル自体が破損している可能性がある。文字化けとは別の問題なので、原因を切り分けて対処しよう。# ZIPの整合性チェック(-t オプション) $ unzip -t windows_data.zip Archive: windows_data.zip testing: ???_20240901.csv Bad CRC d851e3ab (should be 1a2b3c4d) ERROR: Bad CRC 0 for file
・送信元で再圧縮してもらう:最も確実な方法。ネットワーク転送やメール添付でファイルが壊れることがある
・zipコマンドで修復を試みる:
zip -FF corrupted.zip --out fixed.zip で部分的な修復を試みることができる・7zで強制展開:
7z e windows_data.zip はBad CRCを無視して展開できるが、破損部分のデータは保証されない分割ZIPファイル(.z01 / .z02 等)の場合は、すべてのパーツを結合してから展開する必要がある。
# 分割ZIPを結合してから展開 $ cat archive.z01 archive.z02 archive.zip > combined.zip $ unzip -O CP932 combined.zip -d /tmp/extracted_combined/
本記事のまとめ
LinuxでWindowsのZIPを展開した際の文字化け問題は、CP932(Shift_JIS)とUTF-8の文字コードの違いが根本原因だ。状況に応じて次の3つの方法を使い分けよう。| 状況 | 推奨コマンド |
|---|---|
| RHEL系でこれから展開する | unzip -O CP932 filename.zip -d /展開先/ |
| Ubuntu系でこれから展開する | unar filename.zip -o /展開先/ |
| すでに文字化けした状態で展開済み | convmv -f shift_jis -t utf-8 -r --notest /展開ディレクトリ/ |
| エンコーディングが不明 | zipinfo -1 file.zip | nkf --guess で確認後、対処 |
| Bad CRCエラーが出る(破損ZIP) | 送信元で再圧縮 / zip -FFで修復 / 7z eで強制展開 |
文字コード・アーカイブ・権限 ── Linux運用の「詰まり」を体系的に解消する
Linuxの運用トラブルの多くは、OS・ファイルシステム・プロセス管理の仕組みを体系的に理解することで自分で原因を特定して対処できるようになります。断片的なコマンド暗記より、現場で再現性のある判断力を身につける方が長期的に効率が高いです。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます