6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FreeBSDAdvent Calendar 2018

Day 2

FreeBSD で SJIS の zip ファイルを開く

Last updated at Posted at 2018-12-01

Windows 環境で作られたアーカイブファイルはたいがい zip で容赦なくファイル名が日本語 SJIS なわけです。そんな zip ファイルをFreeBSD の標準の/usr/bin/unzip で展開すると容赦なく文字化けして削除もままならないわけです。

ports から iconv 変換対応した unzip をインストールする

SJISなzipを展開するには、pkgではなくportsから iconv パッチが当たった unzip をインストールします。
portsのarchivers/unzip 標準のオプションではパッチが当たりません。pkgのバイナリはportsの標準オプションでビルドしてできているのでパッチは当たっていません。なので、pkgからではなくportsでオプションを変えてからインストールする必要があります。

make configでオプション指定

/usr/ports/archivers/unzip で make configを実行すると出てくる以下の画面で iconv のチェックをしてからmake install でインストールします。

Screenshot from 2018-12-01 13-42-38.png

インストール後、/usr/local/bin/unzip をオプション無しで実行すると、ヘルプが表示されます。
その中に以下の行が入っていれば、iconv パッチが当たっています。


$ /usr/local/bin/unzip
〜〜(略)〜〜
  -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
  -I CHARSET  specify a character encoding for UNIX and other archives

-O オプションで文字コード指定

展開する場合は -Oオプションで cp932またはsjis-winを指定して


$ unzip -Ocp932 sjis.zip

とすれば、UTF-8なファイル名として展開されます。

alias などに登録

普通に unzip コマンドを打つと、/usr/bin/unzip が使われるので、/usr/local/bin/unzip -Ocp932 をシェルのalias に登録しておくといいでしょう。

.cshrc
alias unzip '/usr/local/bin/unzip -Ocp932'
.bashrc
alias unzip='/usr/local/bin/unzip -Ocp932'

#pkgのアップグレードに注意
configをいじったports全般で起きる問題ですが、pkgがアップグレードを検知すると、pkgが勝手にアップグレードを実行し、パッチの当たってない pkg バイナリ版に置き換わってしまいます。

# pkg lock unzip

でロックすることで、勝手に置き換わらないように出来ますが、バージョンアップは自分で検知して、手動で行う必要があります。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?