外部システムからUTF-8で送られてくることを期待している文字列が文字化けしています。
内容を確認すると、UTF-8の文字列がなんらかの変換されておかしなことになっているように思えます。
下記の文字列の組み合わせから、どういった変換がされているかわかりますでしょうか。
■送信される文字列
# 便宜上、タブ区切りとしています。また文字列は「タロウ」です)
期待される文字:
343 202 277 343 203 255 343 202 246
送られてくる文字:
303 243 302 202 302 277 303 243 302 203 302 255 303 243 302 202 302 246
参考)16進数表示
期待される文字:
e3 82 bf e3 83 ad e3 82 a6
送られてくる文字:
c3 a3 c2 82 c2 bf c3 a3 c2 83 c2 ad c3 a3 c2 82 c2 a6
・各文字の前にc2がついている。
・eの場合はc3aに変えられる。
サンプルが少なくて申し訳ありませんがよろしくおねがいいたします!
■補足
元の文字列を別の文字コードで保存していれば、そのなんらかの変換によってUTF-8で出てくることを期待したいのですが、それがどういった変換かわかりません。外部システムの担当者(別ロケーション、別会社)があまり中身を知らないようで、こちらでリモートで原因を突き止めないとクリスマスを乗り越えられない感じです・・・
utf-8変換後の最初のオクテットe3を「Unicodeのコードポイントとみなしてもう一度utf8に変換する」とc3 e3になります。以下同様。なので、送り側でunicode codepoint → utf8変換を重複してかけちゃっているんじゃないでしょうか。
http://www.gcd.org/blog/2009/09/177/
送信側がutf-8で送っているのに、受信側の設定がLatin-1として受け取るようになっているので、それをさらにutf-8に変換して格納しているのが原因です。
http://kgbu.hateblo.jp/entry/20081226/1230259302
ですので、このPerlスクリプトのように「送られてくる文字」をutf-8ファイルとして読み込み、Latin-1に変換して出力すれば、元のutf-8文字列が得られます。
またiconvが入っているなら
iconv -f utf-8 -t latin1 input.txt>output.txt
とすればOKです。
ブログなどのUTF-8のフォームから送信した値を受け取り、Shift-JISに変換してCGIやPHPにリダイレクトするCGIがあります。
フリーソフトなので、ダウンロードし、間に入れると良いかもしれません。
http://www.chama.ne.jp/download/tourlw/index.htm
コメント(0件)