海外製のwikiは、基本的に国際化対応されています。しかし、文字コードの扱いにおいて一部問題があり、文字化けするときがあります。今回はそれを避けるための方法を3種類紹介します。
まず、どういったときに文字化けするのか。MediaWiki、DokuWiki、pmWikiで検証しました。これらwikiでは、新規ページを作成する方法が2つあります。未作成ページへのリンクをクリックするか、ロケーションバーにページ名を入力することです。しかし、ロケーションバーに日本語を入力した場合、古いブラウザではSJIS、EUC、JISコードでページ名を送信してしまうことがあるのです。ブラウザの送信する文字コードについては規格で特に決まっておらず、どんな文字コードが送られて来ても文句は言えません。検証したwikiは、どれもUTF-8を内部コードとしており、間違ったコードのまま文字化けしたドキュメントを作成してしまいました。問題ブラウザはFirefox2のWindows版のみ。IE6、IE7、最近公開されたFirefox3は問題ありませんでした。
- ブラウザの設定で対策
常にUTF-8でURLエンコードするようにします。Wikipediaの編集に必須。今後のブラウザの主流です。利用者に設定変更を強要するため現実的ではありません。以下の設定で切り替えられます。IE [メニュー]-[ツール]-[インターネット オプション]-[詳細設定タブ]-[設定チェックリスト]-[インターナショナル]-[UTF-8のURLを送信する]にチェック
Firefox ロケーションバーに「about:config」と入力。network.standard-url.encode-utf8をtrueにする
- Wikiのソースを修正する
内部文字コードに変更するか、想定外の文字コードは排除する方法です。セキュリティ的にも一番安全ですが、アップデート毎の更新が面倒になります。//DokuWiki - doku.php //import variables $_REQUEST['id'] = mb_convert_encoding(trim($_REQUEST['id']), "UTF-8", "UTF-8,SJIS,EUC-JP");//Add $QUERY = trim($_REQUEST['id']);
//pmWiki - scripts/xlpage-utf-8.php $pagename = preg_replace('!/+$!','',$pagename); $pagename = mb_convert_encoding($pagename, "UTF-8", "auto");//Add $FmtPV['$RequestedPage'] = "'".htmlspecialchars($pagename, ENT_QUOTES)."'";
- .htaccessで変換
PHPスクリプトのときだけ有効な変換フィルターです。php_flag mbstring.encoding_translation on php_value mbstring.http_input UTF-8,SJIS,EUC-JP #autoだと化ける php_value mbstring.internal_encoding UTF-8 php_value mbstring.language Japanese php_value mbstring.substitute_character none
以上、3種類の方法を紹介しましたが、安易な文字コード変換は脆弱性に繋がります。ブラウザで設定する対策以外は十分注意しましょう。