文字セットの変換…。 2004-07-16 (金) 00:40:00+09:00

ソフトウェア

僕のいじった投稿スクリプトも他所では動かないこともあるらしい…。ってことは多分文字セット処理がらみかなぁ。文字セットの扱いややこしいですね(^^;。コード中で文字列がどう処理されている段階にあって、どんな文字セットの可能性があるのか、それへの対応…を、1つずつ確認していくしかないかな。

以下メモ。rNote のソース見てみると rnote_config の SITE_CHARSET (=UTF-8) で文字を扱うのがよさげな感じです。rnote_configをインクルードして使うと共に、スクリプト全部 UTF-8 で保存して使ってます。

自分用参考ページ(参考になれば…):
・PHPのmb系関数
mb-internal-encoding
mb-convert-encoding
mb-detect-order
mb-detect-encoding
あたりが参考になります。

mb-convert-encoding(string str, string to-encoding [, mixed from-encoding])
* JIS, eucjp-win, sjis-winの順番で自動検出し、UCS-2LEに変換 */
$str = mb_convert_encoding($str, "UTF-8", "JIS, eucjp-win, sjis-win");
とあるように、第3引数の文字列で、カンマで区切った文字セットかどうか左から順に試して、見つかったら第2引数の文字セットに変換する。
上の例だと、$str の内容を JIS, eucjp-win, sjis-winの順でチェックして、どれかの文字セットだったら、UFT-8に変換する。

mb_detect_encoding($str, "auto");
・第2引数を"auto"とすると、 "ASCII,JIS,UTF-8,EUC-JP,SJIS"の順に探す指定と同義になる。
・第2引数を省略したときは、mb_detect_order()の設定に従って探す。つまりmb_detect_order("UTF-8,EUC-JP")としてあったら、UTF-8,EUC-JPの順でチェックする。

こんな例とかもアリ?
mb_detect_order("ASCII,JIS,UTF-8,EUC-JP,SJIS");
$str = "ソースに直書きの文字列";
$cs = mb_detect_encoding("日本語です。ぼくの文字コードは?");
if ("UTF-8" != $cs) mb_convert_encoding($str, "UTF-8", $cs);

・ブラウザ上での入力
表示されているページのフォーム内に入力された文字は、ブラウザがそのページの文字セットとして認識している文字セットに変換されて入力されてくるはず。(あってる?)

・サーバーの関与
レスポンスヘッダ
ブラウザが文字コードを判別する仕掛けになっているレスポンスヘッダについて書いてあります。

これは、wwwサーバー(Apache)からブラウザへの情報伝達で、htmlのmetaタグのcharsetに書いた文字セットよりもこっちが優先されるようです。.htaccess に書きます。

このへんの各設定が相互に影響しあう関係図を思い描くのがややこしいですねぇ。いま国家試験直前なのでこのへんじっくり理解する時間的余裕が…すみません。(^^;

[コメントの受付は終了しています ]
1: りん (07/16 15:14)
マニュアルは php.s3.to より http://jp.php.net/manual/ja/ の方が便利っすよー
2: 冬星 (07/17 00:56)
あ、ここが本家ですね。マニュアルリンクはるなら確かにこっちのが良いですね。
ありがとうございます(^^
3: りん (07/20 08:43)
ちなみにブラウザからの入力は、mbstring.http_input の設定次第では、ページの文字コードで帰ってくるとは限らないっすよ。
4: 冬星 (07/21 22:33)
な…なんとも複雑なもんですね。でも全体像を理解しないといつまでたってもいい加減になってしまいますよね(;;