独自グリッドでの文字化けについて教えてください

独自グリッドでの文字化けについて教えてください

by teddy Dragoone -
Number of replies: 5
自前のグリッドサーバにて、インワのオフラインメッセージが文字化けしてしまいます。
英数文字以外は「?」になってしまって解読不可能ですw

こういう症状の場合にサーバのどこの設定に気をつけたらいいのでしょうか。
In reply to teddy Dragoone

Re: 独自グリッドでの文字化けについて教えてください

by Xpyoda Janus -

私も、ちゃんとわかってないけど、とりあえず...。間違いがいっぱいあるという前提で読んでください。

「自前のグリッドサーバ」ということは、JOGridとは関係ない、自前でRobust.exeを動かしているグリッドということですね。
私も、自前でRobust.exe うごかしてますが、同様に文字化けします。Profileモジュールや、Searchモジュールも、同じで、OSGridも同様に文字化けします。

オフラインメッセージモジュールは、INIファイルで外部モジュールを設定して、いろんな構成をとれるようになっているみたいです。
詳しくは、下記のURLを見てください。

Offline Messaging
http://opensimulator.org/wiki/Offline_Messaging

Offline Instant Messaging v2
http://opensimulator.org/wiki/Offline_Instant_Messaging_v2

Offline Instant Messaging v2 を使うと、PHPで外部サーバーを用意したりしないで、Robust.exeだけで、オフラインメッセージを保存できるようです。しかし、これが日本語通りません。
ソースコードの 「 OpenSim/Addons/OfflineIM/ 」あたりのソースコードが関係しているようなのですが...。あと、bin/XMLRPC.dll がなんとなく関係しているような気もします。

たぶんだけど、bin/XMLRPC.dll は、以下のものをコンパイルしたもののようです。

https://github.com/jhs/libopenmetaverse/tree/master/Programs/GridProxy/XmlRpcCS

これは、次のソースコードをベースに、タイムアウト付け加えたりして、修正したもののような気がします(タイムアウトも、たしか30秒とか決め打ちで書かれていたような気がする。タイムアウトがないと、ビュアーが接続できないとハングしたみたいになるし...)。

http://xmlrpccs.sourceforge.net/
https://github.com/joe1chen/XmlRpcCS

というわけで、INIファイルに設定してなんとかなるという問題ではないように思います...。

JOGridは、これらの文字化けに対応するため、日本語が混じるであろう文字列をBASE-64エンコードして、DB等に保存したりXML-PRCメッセージをやり取りしていて、システムの文字コードセンシティブな問題に引っかかるのを避けています。
また、外部にXML-RPCサーバーが別途必要になります。JOGridの場合、Moodleのヘルパーモジュール(というんだろうか???)でこれを実現しているようです。

C#やこれらの要素技術に詳しい人が、なんとかしてくれると嬉しいのですが...(完全 他力本願モード... ^_^;)。

In reply to Xpyoda Janus

Re: 独自グリッドでの文字化けについて教えてください

by Iseki Fumikazu -

こんにちは.

JOGではオフラインメッセージは xmlrpc を使用して,PHPでDBを直接操作しています.

Offline Instant Messaging v2 の方はソースコードを見ていませんが,他のソースコードでは結構平気で文字コードをASCIIに限定していたりします.

実際,グループメッセージは文字コードが ASCII になっているのを確認していて,JOGでは UTF-8 に変更するパッチを当てています.

 

In reply to Iseki Fumikazu

Re: 独自グリッドでの文字化けについて教えてください

by Xpyoda Janus -

オフラインメッセージを日本語で表示することができました!

あれから、いろいろソースコードみたり、OpenSimのWikiを調べたり、Robustのコンソールで

debug http all 6

とかやってみたり、tcpdump してみたりしてました。ビュアーからオフラインの人にIM送った時のメッセージ文字列は、utf-8のコードが、HTTPのPOSTで application/x-www-form-urlencoded のエンコードで robust.exeに送られてるようで、この時点で「あ」って送ってみると「%e3%81%82」と%エンコードされてれるけど文字コード自体はutf-8のまんまでとどいてました。でも、mysqlに格納する時点で「?」になってしまいます(私はMySQLを使ってます)。

ここで、MySQLに接続するクライアント側のエンコーディング設定が、latin1 のまんまなんじゃないかと、ふと思って、Robust.HG.ini, config-include/GridCommon.ini のMySQLのDBへの接続文字列に、「CharSet=utf8;」を追加してみました。

[DatabaseService]
    StorageProvider = "OpenSim.Data.MySQL.dll"
    ConnectionString = "Data Source=localhost;Database=mydb;User ID=myname;Password=mypass;Old Guids=true;CharSet=utf8;"

MySQLのデータベースは、utf8をデフォルトにして作成しておきます。

mysql> create database nxgrid default character set utf8;

もしくは、my.cnf の[mysqld]セクションに 「character-set-server=utf8」を追加して、再起動すればいいんじゃないかと思います(<--- 未検証なので自分でちゃんと調べてください!)。

こうすれば、「Offline Instant Messaging v2」では、日本語が表示されました。バンザーイ!

teddyさんも、試してみてください。

ちなみに、ProfileやSearchの方は、まだうまくいってません。

In reply to Xpyoda Janus

Re: 独自グリッドでの文字化けについて教えてください

by teddy Dragoone -
おおおーー!
さすがヨーダさん、天才!神様!仏様!?

さっそくテストしてみます!
ありがとうございました。
In reply to Xpyoda Janus

Re: 独自グリッドでの文字化けについて教えてください

by teddy Dragoone -
さっそくテストしてみました。

見事に日本語でオフラインメッセージ残すことができました!
ほんとにありがとうございます!