【Mac】rar ファイルを展開すると文字化けしたファイルが出てくる

2020年3月9日

rar ファイルを展開すると、ファイル名が文字化けしていることがたまにある。
 中身は問題ないことが多い。ファイル名が文字化けしてしまっているだけなのだ。

筆者の狭い知見で恐縮だが、そういう rar はどのように展開してもおそらく駄目。
 文字化けは、解消しない。
 大人しくリネームするくらいしか手段はない、今のところ。

The Unarchiver で駄目なら駄目

さまざまなアーカイブを展開してくれる The Unarchiver は、展開と同時にファイル名の文字コードを自動で判別してくれる。

🔗 The Unarchiver | Top Free Unarchiving Software for macOS

これで展開して文字化けした場合は、ほぼ駄目と考えていいと思う。
 The Unarchiver は、環境設定の「詳細設定」タブでエンコーディングのしきい値を調節できる。

The Unarchive の詳細設定

これを 100 パーセントにすれば、rar ファイルのエンコーディングを選べるはずだが、駄目なファイルはここを 100 にしようが 200 にしようが文字化けのまま展開される。

unar コマンドと lsar コマンドでもたぶん駄目

ほかに出来ることがあるのではないか、と考えたとき、ただちに思いつくのが unar コマンドである。unar コマンドは The Unarchiver なみに圧縮ファイルを展開できる、便利なコマンドだ。
 Homebrew で簡単にインストールできる。

brew install unar

もしくは、

🔗 Unar and Lsar | Command Line Tools for The Unarchiver

上記リンクでバイナリをダウンロードできる。ダウンロードした zip を展開すると unar と lsar というバイナリファイルがあらわれる。これらを/usr/local/bin/とかに置けばいいのではないかと思う。よくわからないが。

この unar コマンド、エンコードを指定して圧縮ファイルを展開できる。

unar -e エンコード名 圧縮ファイル

エンコード名のリストは、以下を実行すると見られる。

unar -e list

もしくは unar -e help でも同じだ。
 2020 年 3 月現在、リストはこのようになっている。

> unar -e help
Available encodings are:
  * macintosh: Western (Mac OS Roman)
  * x-mac-japanese: Japanese (Mac OS)
  * x-mac-trad-chinese: Traditional Chinese (Mac OS)
  * x-mac-korean: Korean (Mac OS)
  * x-mac-arabic: Arabic (Mac OS)
  * x-mac-hebrew: Hebrew (Mac OS)
  * x-mac-greek: Greek (Mac OS)
  * x-mac-cyrillic: Cyrillic (Mac OS)
  * x-mac-devanagari: Devanagari (Mac OS)
  * x-mac-gurmukhi: Gurmukhi (Mac OS)
  * x-mac-gujarati: Gujarati (Mac OS)
  * x-mac-thai: Thai (Mac OS)
  * x-mac-simp-chinese: Simplified Chinese (Mac OS)
  * x-mac-tibetan: Tibetan (Mac OS)
  * x-mac-centraleurroman: Central European (Mac OS)
  * x-mac-symbol: Symbol (Mac OS)
  * x-mac-dingbats: Dingbats (Mac OS)
  * x-mac-turkish: Turkish (Mac OS)
  * x-mac-croatian: Croatian (Mac OS)
  * x-mac-icelandic: Icelandic (Mac OS)
  * x-mac-romanian: Romanian (Mac OS)
  * x-mac-celtic: Celtic (Mac OS)
  * x-mac-gaelic: Gaelic (Mac OS)
  * x-mac-farsi: Farsi (Mac OS)
  * x-mac-ukrainian: Cyrillic (Mac OS Ukrainian)
  * x-mac-inuit: Inuit (Mac OS)
  * utf-16: Unicode (UTF-16)
  * utf-7: Unicode (UTF-7)
  * utf-8: Unicode (UTF-8)
  * utf-32: Unicode (UTF-32)
  * utf-16be: Unicode (UTF-16BE)
  * utf-16le: Unicode (UTF-16LE)
  * utf-32be: Unicode (UTF-32BE)
  * utf-32le: Unicode (UTF-32LE)
  * iso-8859-1: Western (ISO Latin 1)
  * iso-8859-2: Central European (ISO Latin 2)
  * iso-8859-3: Western (ISO Latin 3)
  * iso-8859-4: Central European (ISO Latin 4)
  * iso-8859-5: Cyrillic (ISO 8859-5)
  * iso-8859-6: Arabic (ISO 8859-6)
  * iso-8859-7: Greek (ISO 8859-7)
  * iso-8859-8: Hebrew (ISO 8859-8)
  * iso-8859-9: Turkish (ISO Latin 5)
  * iso-8859-10: Nordic (ISO Latin 6)
  * iso-8859-11: Thai (ISO 8859-11)
  * iso-8859-13: Baltic (ISO Latin 7)
  * iso-8859-14: Celtic (ISO Latin 8)
  * iso-8859-15: Western (ISO Latin 9)
  * iso-8859-16: Romanian (ISO Latin 10)
  * cp437: Latin-US (DOS)
  * cp737: Greek (DOS)
  * cp775: Baltic (DOS)
  * cp850: Western (DOS Latin 1)
  * cp851: Greek (DOS Greek 1)
  * cp852: Central European (DOS Latin 2)
  * cp855: Cyrillic (DOS)
  * cp857: Turkish (DOS)
  * cp860: Portuguese (DOS)
  * cp861: Icelandic (DOS)
  * cp862: Hebrew (DOS)
  * cp863: Canadian French (DOS)
  * cp864: Arabic (DOS)
  * cp865: Nordic (DOS)
  * cp866: Russian (DOS)
  * cp869: Greek (DOS Greek 2)
  * cp874: Thai (Windows, DOS)
  * cp932: Japanese (Windows, DOS)
  * cp936: Simplified Chinese (Windows, DOS)
  * cp949: Korean (Windows, DOS)
  * cp950: Traditional Chinese (Windows, DOS)
  * windows-1252: Western (Windows Latin 1)
  * windows-1250: Central European (Windows Latin 2)
  * windows-1251: Cyrillic (Windows)
  * windows-1253: Greek (Windows)
  * windows-1254: Turkish (Windows Latin 5)
  * windows-1255: Hebrew (Windows)
  * windows-1256: Arabic (Windows)
  * windows-1257: Baltic (Windows)
  * windows-1258: Vietnamese (Windows)
  * us-ascii: Western (ASCII)
  * Shift_JIS: Japanese (Shift JIS X0213)
  * GBK: Chinese (GBK)
  * gb18030: Chinese (GB 18030)
  * iso-2022-jp: Japanese (ISO 2022-JP)
  * iso-2022-jp-2: Japanese (ISO 2022-JP-2)
  * iso-2022-jp-1: Japanese (ISO 2022-JP-1)
  * iso-2022-cn: Chinese (ISO 2022-CN)
  * iso-2022-kr: Korean (ISO 2022-KR)
  * euc-jp: Japanese (EUC)
  * gb2312: Simplified Chinese (GB 2312)
  * euc-tw: Traditional Chinese (EUC)
  * euc-kr: Korean (EUC)
  * shift_jis: Japanese (Shift JIS)
  * koi8-r: Cyrillic (KOI8-R)
  * big5: Traditional Chinese (Big 5)
  * x-mac-roman-latin1: Western (Mac Mail)
  * hz-gb-2312: Simplified Chinese (HZ GB 2312)
  * big5-hkscs: Traditional Chinese (Big 5 HKSCS)
  * koi8-u: Ukrainian (KOI8-U)
  * x-nextstep: Western (NextStep)
  * ibm037: Western (EBCDIC Latin 1)

Windows の Shift-jis で固められた zip ファイルを展開するなら、

unar -e cp932 圧縮ファイル.zip

ということになるかと思う。

どんな文字コードで圧縮されたファイルかわからない場合は、いろいろな文字コードを試すことになるかもしれない。そのたびに圧縮ファイルを展開するのはダルい。
 unar と一緒にインストールされる lsar を使えば、わざわざ展開しなくても中身を見られる。
 使い方は unar とほぼ同じだ。

lsar -e cp932 圧縮ファイル.zip

lsar -e list で、文字コードのリストを表示できる。

以下のようなシェルスクリプトを作ってみた。
 引数に rar ファイルを渡し、文字コードのリストを上から順番に lsar で試すスクリプトである。

📝 enc.sh

#!/bin/zsh

# enc.sh rarファイル
#
# というふうに使う。文字化けが直っていれば、y キーで展開する。
# 直ってなければ n キーで次のエンコードへ。
# lsar と unar コマンドが必要。

enc_list=$(lsar -e list | awk '{print $2}' | sed -e 's/://g')
dir=$(dirname "$1")
rarfile="$1"

wl=$(echo $enc_list | wc | awk '{print $1}')

for num in `seq $wl`
do
    if test $num -eq 1; then
        continue
    fi
    enc=$(echo $enc_list | sed -n "$num"p)
    lsar -e "$enc" "$rarfile"
    echo "$enc"
    echo '文字化け直ってる?(y/n)'; if read -q;
    then
        unar -e "$enc" -o "$dir" "$rarfile"
        break
    fi
done

enc.sh rarファイル.rar という使い方をする。ためしに lsar にかけて、ファイル名が文字化けしてなかったら y キーで展開する。文字化けしていたら、n キーで次の文字コードをためす。

とはいえ、くどいようだが筆者の経験では、文字化けするファイル名を吐く rar ファイルは、unar でなにをしても駄目だった。

Windows や Linux に持っていっても駄目

おそらくこういう rar は、もともとファイル名が文字化けしたものを圧縮しただけのことなのだと思う。

こういう rar ファイルを Windows や Linux に持っていって展開してみても、結果は変わりなかった。OS がどうこうという話ではないようだ。
 まぁあくまで、筆者の狭い知見のうちの話である。
 ちゃんとしたファイルなら、ほとんどの場合は The Unarchiver で正しく展開できるのではないかと思われる。