2007-12-11 (火)
*tarと文字コード
tarで固めるときに,ファイル名の文字コードと環境変数の文字コードが違うと展開しても正常に元に戻らないことがある.たぶん,ファイル名中の変な文字を消す処理がロケールに依存していて,おかしなことをしてしまうのだろう.
ロボ研のサーバ上に,そんなtarがあったので元のデータの復元を試みてみる.UTF-8のファイル名なのに,eucで固めてしまったらしい.しかも3GB以上ある.
UTF-8で展開するとさらに悪化するので,格納時と同じeucにして展開.壊れたファイル名を良く見てみると,規則が見えてくる.
- 全角のディレクトリ名の最後の1バイトが欠けているものがある
- ディレクトリの区切りが\xAFになっている箇所がある
- 「(」が\xA8,「)」が\xA9になっている箇所がある
このあたりで意味するところ分かりました.
eucでは,最上位ビットが立ったバイトが奇数バイト並ぶことが無いので,無理やり辻褄を合わせてしまうんですね.
適当なPerlスクリプトを書いてディレクトリを作り直してリネームしましたが,壊れたファイル名が重なって上書きされているファイルもあるっぽい.tarを改造した方が上手くいったかも.