まちBBS東京23区板 自治スレッド 1

このエントリーをはてなブックマークに追加
518東京都名無区:2010/10/17(日) 16:25:49 ID:G8xCYDNg
文字化けしてる箇所についてちょっとバイナリエディタで覗いてみたんだけど
・大部分は C2 ?? C2 ?? になっててC2除去するとShift-JISで読める
・偶に C3 ?? の箇所があり、C3除去して??に40加算すると読める場合がある
・偶に C2 ?? ?? の箇所があり、その場合後の??は00-7Fの範囲
・同じく00-7Fの1バイト文字は何も付加されていない
って感じだった。
これってUTF-8のバイト列に似てるんだけどC2除去するだけでShift-JISになるからUTF-8への正常な変換ではない
たぶんShift-JISの文字列をUTF-16としてUTF-8に変換するような処理が誤爆してるんだと思う。

例:Shift-JISの「東京都」(93 8C 8B 9E 93 73)を 93 00 8C 00 8B 00 9E 00 93 00 73 00
のUTF-16として読み込みUTF-8への変換を行うと C2 93 C2 8C C2 8B C2 9E C2 93 73(ツ督個仰楪都)になる

逆に、
1.datファイルから文字化け部分をバイナリエディタで切り出し新規ファイルに保存
2.そのファイルをUTF-8として開く(秀丸エディタで開いたらエンコードの種類でUTF-8&ファイルを読み込みし直す選択)
3.UTF-16として保存(秀丸エディタで名前をつけて保存&エンコードの種類でUTF-16選択)
4.3で保存したファイルをバイナリエディタで開き 00 を除去する
以上で投稿者が書き込もうとした文章が復元できる

文字化け発動条件はまだわからんけど
複数の文章復元すれば条件特定できるかもしれないし
書き込み処理のスクリプトから上記の誤爆しそうな処理呼び出してるところを見直せば何か見つかるかも

俺は今日は疲れたから復元処理からの特徴把握はやる気のある人に任せる