文字セットの変換…。 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)
な…なんとも複雑なもんですね。でも全体像を理解しないといつまでたってもいい加減になってしまいますよね(;;


追記ってなんだろう? 2004-07-15 (木) 13:03:00+09:00

ソフトウェア

本日の昼休み。

テスト。y=ax2+b, 2H2+O2→2H2O

以前MTで「追記」を試してみたところ、要は同じ日の2件目以降の投稿のことでした。

rNoteは特に追記と銘打った機能はないようですが、同日2件目の投稿をしたら、普通に表示されるわけで、既にMTでいうところの「追記」は付いているという結論になる。(やり方としては、Dateタグが同じ日付のxmlファイルを作るだけ。ファイル名はなんでもいい。)

違いといえば、MTの場合、デフォルトの画面構成だと、日ごとにがっちり分類表示されるけど、rNoteのデフォルトの画面構成だと、投稿記事同士は一律に順に枠で囲って表示されるので、同日2件目の記事だとかいう区別はないというだけで。

…という理解であっていれば、rNoteの場合は追記の機能は既にあるので、スクリプトですることがあるとしたら、既存記事を読み込んで編集するとか、削除するとかの管理機能…ってことになるのかなぁ??

あ…そう言えば、同日記事同士の前後関係は、どうなってるんでしょうね。ファイル自身のタイムスタンプ??翌日以降になってから、ある特定の日の追記の積りで2件目の記事を投稿するとかは構造的に出来るんでしょうか。(あんまりやりたくない編集だけど。^^;)2件登録されている同日記事のうち、一件目の追記として差し込みたいときはどうしたら??

…てか、Dateタグで時分秒まで管理するなりして、あくまでDateタグの時刻同士で比べて同日記事の前後関係を管理するようにしたらシンプルになりそうな気が…。うーん…時間がとれるようになったら、ソース拝見してみます(^^;。

[コメントの受付は終了しています ]
1: りん (07/15 17:47)
Dateタグが同一なら、前後関係は、単純にファイルシステム上で先に見付かった方が上になるだけですー。
自分で前後を付けたいなら、Dateタグを1分だけ増やすとかで。
2: 冬星 (07/15 20:33)
おぉ作者様はじめまして!あー、なるほど…。Dateタグ時刻情報持ってるんですね。もう少し行間読むようにしないと。
表示順決定一番きれいな仕組みですね。解説ありがとうございます(^^


この前ここにはったやつで変更してあったところは、置換機能以外で大きいのは下の4点くらいです。

1. $newdata = mb_convert_encoding($newdata, "UTF-8", "euc");
のところで、"euc"を"auto"にした(EUC以外の文字セットが来る可能性を考えて)。変換元として認識する文字セットは mb_detect_order() で設定しておけるようです。

2. $PHP_SELF を $_SERVER['PHP_SELF'] にした。
$PHP_SELF は register_globals が on の時のみ利用できるものだそうなので、Rinn さんのページに載っている .htaccess への設定 ( php_flag register_globals Off ) をするとうまく動かなくなるので変更。

3. 入力欄の textarea の wrap を hard から soft に。
タグを挿入したりすると制限文字数をオーバーしたりするのでこうしてみた。問題なく記事表示されるようでよかった。

4. 記事の xml ファイルの年を4桁2桁どちらでか選べるように define をきって、去年とかの記事も投稿ができるように。
今まで作っていたページの日記を移動してもってきたいときに記事を貼り付けて投稿すると便利かなと。

[コメントの受付は終了しています ]
1: とみら (07/14 01:32)
1、2、4を直してみましたんで、よろしければ試用してみて下さい☆彡 まだmb_detect_orderの使い方がよくわかってないのでやや不安ですが……
この記事のリンク元 | 28 |