SQLiteManager1.1.0で文字化けが発生するでUTF-8のデータを扱っている時にメッセージが文字化けする問題を解決したいというコメントをもらったので回答します。
まず、なぜUTF-8のデータを扱っているときに文字化けするかというと、表示しているlangファイルの文字コードがeuc-jpだからです。そこで表示しているlangファイルの文字コードをUTF-8に変換してUTF-8のデータを扱っているときに文字化けしないようにしてみます。
作業としては簡単で、lang/japanese.inc.phpを開いて10行目にある$charsetの値をeuc-jpからutf-8に置き換えます。どういう意味があるのか実はよくわかってませんが次の行にあるja-euc-jpもja-utf-8に置き換えましょう。置換が終わったら今度はファイルをUTF-8に変換して保存してください。vimの場合、:set fileencoding=utf-8
で変換できます。
これで作業は終わりです。実際にやってみたところ問題なく画面がでてきました。
が。質問者によると、Warning: cannot yet handle MBCS in html_entity_decode()
というエラーメッセージがでるという事だったので調べてみると、このエラーメッセージはhtml_entity_decode関数が対象のcharsetがマルチバイトであるためハンドリングできないということを表しているようです。さらにhtml_entity_decode()関数のマニュアルにはPHP4.3.x以降のバージョンならEUC-JPやShift_JIS、UTF-8をサポートしているけれどこの関数はPHP5からしかマルチバイト文字列をサポートしていないという謎の文章が。
ここで考えられるエラーメッセージ発生の原因は2つあります。
1つは、質問者の環境がPHP4系でhtml_entity_decode関数のマルチバイトハンドリングが5以降しか対応していない場合です。この場合、修正にはhtml_entity_decodeしている部分を自前でdecodeする必要があるのであきらめて英語で作業したほうが良いきがします(ぇ
しかし、マルチバイトのハンドリングができない事を理由にするとEUC-JPだってエラーメッセージが出るはずです。なので質問者の環境ではマルチバイトハンドリングができているような気がします。
2つ目は、質問者がUTF-8への変換に失敗して不思議UTF-8になっている可能性。自分はこれが原因ではないかと考えています。BOM付きだったりBOMなしだったりUTF-16だのUTF-32だのとにかくUTF-8はなんだか似たようなものがたくさんあります。どのようなツールで変換したのか、ビューワからちゃんとみれているのかなどなど気になりますね。
というわけで参考になれば幸いです。
Related posts:
ご指摘ありがとうございます。
まず環境ですが、ご察しのとおりPHP4.4.1になります。
「不思議UTF-8」の件ですが、秀丸、NEXTFTP、Charset Converterなど様々なツールでUTF-8へ変換しましたが、全て結果は同じでした。もちろんエディタで普通に見れます。
PHPスクリプトからデータベースへアクセスしても、文字化けせず普通に表示されす。
これらより、UTF-8での格納は問題ないと思われます。
あとはPHP5環境で実験するだけですが・・・今は手元にありません(TT)
マニュアルのほうに
// PHP 4.3.0 より前のバージョンでは、このようにします
function unhtmlentities($string)
{
// 数値エンティティの置換
$string = preg_replace(‘~([0-9a-f]+);~ei’, ‘chr(hexdec(“\1″))’, $string);
$string = preg_replace(‘~([0-9]+);~e’, ‘chr(\1)’, $string);
// 文字エンティティの置換
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl = array_flip($trans_tbl);
return strtr($string, $trans_tbl);
}
というサンプルがありました。
自前decodeの方法ですね。ありがとうございます。
ピンバック: ブログだとか