listenによる入力
直接スクリプトエディタに入力すると化けてしまう日本語ですが、実はlistenで正しく入力することができます。
以下のような単純なエコースクリプトで試してみて下さい。
01:default {
02: state_entry(){
03: llListen(0, "", NULL_KEY, "");
04: }
05:
06: on_rez(integer arg){
07: llResetScript();
08: }
09:
10: listen(integer ch, string nm, key id, string message){
11: llSetText(message, <0.0, 0.0, 1.0>, 1.0);
12: }
13:}
誰かが発言した内容がオブジェクトのタイトルになります。
日本語をしゃべると、それがそのままオブジェクトのタイトルに表示されるのがわかると思います。
11行目でllSetText()の代わりにllSetObjectDesc(message)を使うと、オブジェクトのdescription(説明)に日本語を入れておくことができます。
descriptionはllGetObjectDesc()で取り出すことができますので、スクリプトがリセットされても再利用が可能です。
ただし、buildツールのeditウインドウでは化けて表示されますので編集はできません。
descriptionに保持できる最大文字数は約8034文字です。
ちょっとした日本語の文章を保持するには十分なサイズでしょう。
ちなみにllSetObjectName()でオブジェクト名を日本語にしてしまうことも可能です。
llSay()の直前に名前を日本語に変更すると、日本語の名前で発言されます。
ですがインベントリ等に戻したときに不都合がありますので、名前を日本語にしたあとは元に戻しておいたほうが良いでしょう。
URLエスケープの使用
descriptionはオブジェクトの属性ですので、スクリプト本体に日本語データが保持されているわけではありません。
スクリプトを他のオブジェクトにコピーした場合などは当然ながらdescriptionのデータは引き継がれません。
そこで、スクリプト自体に日本語を保持しておく方法を紹介しておきます。
list messages = [
"%e3%81%93%e3%82%93%e3%81%ab%e3%81%a1%e3%81%af%e3%80%81%e4%b8%96%e7%95%8c%ef%bc%81",
"%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%81%a7%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%92%e8%a1%a8%e7%a4%ba%ef%bc%81"
];
default {
state_entry(){
llSay(0, llUnescapeURL(llList2String(messages, 0)));
}
touch_start(integer touched){
llSay(0, llUnescapeURL(llList2String(messages, 1)));
}
}
スクリプトのスタート時とタッチされたときに、リストmessagesに定義されたメッセージを発言するだけのスクリプトです。
ただし、messagesに定義された文字列は「URLエンコード」されています。
「URLエンコード」とは、インターネットのURLに日本語などのマルチバイト情報や空白文字を保持できるように、文字情報を変換してURLとして使える文字のみにすることを言います。
簡単に言えば、日本語を英数字(と%などの記号)に変換したものです。
これをそのまま表示したのでは読めませんので、llSay()する際にllUnescapeURL()を使ってデコードします。
デコードとはエンコードの逆で、URL文字を元の日本語に戻す処理です。
この方法を使うと、日本語情報をスクリプト内に保持しておくことができます。
エンコードされているので何が書かれているのかさっぱりわからないという難点はありますが(^^;
コメントをしっかりと書いておくべきでしょう。
ちなみに、日本語をエンコードするには以下のページが便利です。
http://www.tagindex.com/tool/url.html
エンコードの際の文字コードにはUTF-8を使用して下さい。
【余談】
日本語を扱う方法としては、他にllHTTPRequest()を使った外部Webからの取得という手もあります。
lslの枠を超えた処理が可能ですが、lsl以外のWebアプリケーションの知識が必要になってきますので、今回は説明しません。