« 今見ているページにGoogle Mapsを追加するBookmarklet | Main | SanDisk CruzerMicro 4GB »

PEAR::Services_Lingrで日本語を扱うときの注意

Cometを使ったホントの非同期ブラウザチャットのLingr、使ってみるとかなりCool。ブラウザベースだからソフトをインストールする必要もないし、軽くチャットするだけならアカウントを取る必要すらない。まさにインスタントなメッセンジャー。でもってこのLingr、APIまで公開してあり、様々なサービスに展開する可能性を秘めている。実にCool。Lingrの仕組みについては江島健太郎氏のこのエントリを読んでいただくとして、APIを使って何かしたい人には、既に様々なライブラリDeveloper Wiki上で公開されている。いやあ、実に2.0、2.0。

でもって、ライブラリの一つ、Lingr APIをPHPで簡単にいじくることのできるパッケージのPEAR::Services_Lingrを使ってみたんだけど、Room.observeメソッドとかでメッセージを取り出すときに日本語のメッセージがうまく取れない。調べてみたら、Lingr APIが返してくるXML中の日本語が数値文字参照で、そのままだとXML_Unserializerが読んでくれないことがわかった。ので、Services_Lingrパッケージの中のLingr.phpの中でXML_UnserializerにXMLを投げるところの前(94行目あたり)に下記のようなコードを挿入して問題解決。

...
$result = $http->getResponseBody();
$map = array(0x0080, 0xffff, 0, 0xffff);
$result = mb_decode_numericentity($result, $map, "UTF-8" );

$xml =& new XML_Unserializer();
...


UTF-8じゃなくてEUC-JPにするときは、$map=array(0, 0x10FFFF, 0, 0xFFFFFF); とすればよい。これでXML_Unserializerで処理して返ってきた配列がちゃんと日本語で返ってくる。mb_decode_numericentityの使い方については、ここここを参考にした。有難うございます。
ひょっとしたら最新版のXML_Unserializer使えば問題なく動くのかもしれないけど、一応メモ代わりに。…って、Lingr APIをPHPで使いたい人、しかもXML_Unserializerdが何かちゃんと日本語処理してくれない人、ってえらい限定された人向けのエントリだな。

Powered by ScribeFire.

|

« 今見ているページにGoogle Mapsを追加するBookmarklet | Main | SanDisk CruzerMicro 4GB »

「WEBサービス」カテゴリの記事

「インターネット」カテゴリの記事

Comments

ありがとうございます!実は教えて!gooに以下のような質問を投げたのですが返事をもらえず、困っていたところでした。
http://oshiete1.goo.ne.jp/qa3127478.html
おかげさまで日本語を表示する事ができました。どうお礼を申し上げてよいか分かりません。TEDDY-G様をRSSリーダに登録していて、本当によかったです。感謝です。

Posted by: mine-D | 2007.07.05 at 09:21 PM

>mine-D様
おお、お役に立てて何よりです。あたかもすぐ解決したように書いてますが、原因はすぐ特定できたものの、数値文字参照をマルチバイト文字に直すところで暫く悩みました。マルチバイト文字と文字コードの周りは常に悩みが生じますね。
Lingr APIで面白いものを作られたら、是非教えてください。

Posted by: TEDDY-G | 2007.07.05 at 11:32 PM

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/20589/15667717

Listed below are links to weblogs that reference PEAR::Services_Lingrで日本語を扱うときの注意:

« 今見ているページにGoogle Mapsを追加するBookmarklet | Main | SanDisk CruzerMicro 4GB »