[samba-jp:20398] Re: おかしなエンコードに伴う文字化けの場合は? (Re: Re: Vine 3.2、Windows、Proftpd、Samba混合環境の文字化けについて)

MORIYAMA Masayuki moriyama @ miraclelinux.com
2008年 9月 27日 (土) 15:48:44 JST


森山です。

Kenichi Okuyama さんは書きました:
> 森山> ■ファイル名文字コード変換ツールについて
> 森山> ファイル名の文字コード変換であれば convmv コマンドを使
> 森山> うのが良いかもしれません。
>
> これらのツールはファイル名が「正常にエンコードされて」格納
されている
> 場合は使えるのですが、「異常なエンコード」の場合には役に立
ちません。
> で、質問はそういう「異常なエンコード」の内、よくありそうな
パターンを
>
> - 集めているサイト
> - 自動分析するツール
> - パターンを指定すると、文字コード変換の一環として「文字化
けを直して
>   くれる」ツール
>
> などを、誰かしりませんか? というものです。

文字化けの解析は、臨機応変に対応する必要があるので、ツール化
は難しいのではないかと思います。

> 先日、あるお客様の環境で、 Win98 を使っていた頃にサーバに
保存したファ
> イル名が文字化けした、というトラブルの対応をしました。ファ
イル名を見
> た所、エンコード的には utf8 のようだったのですが、内容が
変。かなり七
> 転八倒した上で発見したのは:
>
> 1) ファイルシステムからやってくるファイル名(Pathではなくそ
のファイル
>    名だけ)を utf8 として解釈し、これを UCS2 に変換する。
>
> 2) 1 で得られたUCS2 バイト列を、今度は16bitの「Word」の羅
列とし、それ
>    らが『実は1byteの文字コードを現す(上位8bitを消す)』と解
釈する(よう
>    するに1バイトおきに出てくる 0x00 を消す)
>
> 3) 2 が済むと、SJISの文字列が表れる

なんとなくシフトJIS を ISO-8859-1 -> UTF-8 変換
してしまったような雰囲気が漂っていますね。

convmv -f utf-8 -t iso8859-1 *
で戻りそうな気がします。

$ echo 漢字 | iconv -f utf-8 -t cp932 | od -tx1
0000000 8a bf 8e 9a 0a
0000005
          ↑
UTF-8 環境で試しているので cp932 に変換

$ printf "\x8a\xbf\x8e\x9a" | iconv -f iso8859-1 -t utf-8 |
od -tx1
0000000 c2 8a c2 bf c2 8e c2 9a
0000010
          ↑
たぶんこんな感じのコードがサーバーに保存されてのではないかと
推測します。このコードを解析する。

$ printf "\xc2\x8a\xc2\xbf\xc2\x8e\xc2\x9a" | nkf --guess
UTF-8
  ↑
とりあえず、nkf を使ってエンコーディングの種類を調べてみる。
nkf は UTF-8 と判定しました。(あくまでも参考程度に)

$ printf "\xc2\x8a\xc2\xbf\xc2\x8e\xc2\x9a" | iconv -f utf-8
-t utf-16le | od -tx2
0000000 008a 00bf 008e 009a
0000010
          ↑
UTF-8 は UTF-16 や UTF-32 に変換して Unicode のスカラー値を
確認するのが基本中の基本。(Endian に注意)
データは U+0000〜U+00FF の範囲に収まっている感じですね。

http://www.unicode.org/charts/PDF/U0080.pdf
          ↑
U+0080〜U+00FF は、この辺。(Latin-1)
という事は、ISO-8859-1。

$ printf "\xc2\x8a\xc2\xbf\xc2\x8e\xc2\x9a" | iconv -f utf-8
-t iso8859-1 | od -tx1
0000000 8a bf 8e 9a
0000004
          ↑
utf-8 から iso8859-1 へ変換をするとこうなる。
元に戻っていますね。

--
森山 将之 <moriyama @ miraclelniux.com>




samba-jp メーリングリストの案内