はじめに
2007年4月現在、スクリプトやノートカードの日本語対応は十分とは言えません。
スクリプトのコード内やノートカードに日本語を書くと化けてしまい、llSayで発言させたり、llSetTextで表示したりすることができません。
しかしながら、日本人街などにおいては日本語を使ったメッセージを表示させたいという要望はしばしばあり、苦労している方もいらっしゃるのではないでしょうか。
スクリプトのコード内やノートカードに日本語を書くと化けてしまい、llSayで発言させたり、llSetTextで表示したりすることができません。
しかしながら、日本人街などにおいては日本語を使ったメッセージを表示させたいという要望はしばしばあり、苦労している方もいらっしゃるのではないでしょうか。
スクリプトで日本語を扱う方法はいくつかありますが、基本的なものを紹介しておきます。
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はllGetObjectDesc()で取り出すことができますので、スクリプトがリセットされても再利用が可能です。
ただし、buildツールのeditウインドウでは化けて表示されますので編集はできません。
descriptionに保持できる最大文字数は約8034文字です。
ちょっとした日本語の文章を保持するには十分なサイズでしょう。
ちょっとした日本語の文章を保持するには十分なサイズでしょう。
ちなみにllSetObjectName?()でオブジェクト名を日本語にしてしまうことも可能です。
llSay()の直前に名前を日本語に変更すると、日本語の名前で発言されます。
ですがインベントリ等に戻したときに不都合がありますので、名前を日本語にしたあとは元に戻しておいたほうが良いでしょう。
llSay()の直前に名前を日本語に変更すると、日本語の名前で発言されます。
ですがインベントリ等に戻したときに不都合がありますので、名前を日本語にしたあとは元に戻しておいたほうが良いでしょう。
URLエスケープの使用
descriptionはオブジェクトの属性ですので、スクリプト本体に日本語データが保持されているわけではありません。
スクリプトを他のオブジェクトにコピーした場合などは当然ながら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として使える文字のみにすることを言います。
簡単に言えば、日本語を英数字(と%などの記号)に変換したものです。
ただし、messagesに定義された文字列は「URLエンコード」されています。
「URLエンコード」とは、インターネットのURLに日本語などのマルチバイト情報や空白文字を保持できるように、文字情報を変換してURLとして使える文字のみにすることを言います。
簡単に言えば、日本語を英数字(と%などの記号)に変換したものです。
この方法を使うと、日本語情報をスクリプト内に保持しておくことができます。
エンコードされているので何が書かれているのかさっぱりわからないという難点はありますが(^^;
コメントをしっかりと書いておくべきでしょう。
エンコードされているので何が書かれているのかさっぱりわからないという難点はありますが(^^;
コメントをしっかりと書いておくべきでしょう。
その他の方法
日本語を扱う方法としては、他にllHTTPRequest()を使った外部Webからの取得という手もあります。
lslの枠を超えた処理が可能ですが、lsl以外のWebアプリケーションの知識が必要になってきますので、今回は説明しません。
lslの枠を超えた処理が可能ですが、lsl以外のWebアプリケーションの知識が必要になってきますので、今回は説明しません。