もんしょの巣穴blog

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

Squirrel おまけ

Squirrelの話は前回で終了しているのですが、おまけとして日本語を使用する方法を。


Squirrelは基本的にASCIIコードしか使用できません。
日本語の代表とも言えるSJISはその特殊性からSquirrelでは使用できません。
例えば


print("ソース")


という命令を実行してもらえばわかると思います。エラーが出るはずです。
SJISはASCIIコードの使用していない部分を利用して、この数値が入ってきたら2バイトで処理をする、という感じになっています。
つまり、その処理をきちんとしない限りSJISは使用できません。
しかし、日本のゲームでSquirrelを使用するつもりなら日本語は使用できないと困ります。
その方法は2つ。
1つはUNICODEを使用する方法。もう1つはソースをいじってSJISを使用できるようにすることです。


UNICODEを使用するのは簡単です。
Squirrelのヘッダファイルをインクルードする前に以下の文字列を定義するだけです。


#define UNICODE
#define _UNICODE


Squirrelは標準的にUNICODEが使用できるようになっています。
ただし、UNICODEを使用する場合はASCIIコードが使用できなくなります。
日本でだけ発売することが前提のゲームや同人ゲームならUNICODEでなくても問題ありませんが、日本、北米以外でも発売するようならUNICODEは有効です。
韓国やヨーロッパなどではUNICODEがあると便利だと思います。


もう1つのソースをいじってSJISを使用できるようにする方法ですが、これもそんなに難しくありません。
ソースの sqlexer.cpp の330行目に以下のような命令を追加します。


#ifndef SQUNICODE
    if(((CUR_CHAR >= 0x81) && (CUR_CHAR <= 0x9F))
        || ((CUR_CHAR >= 0xE0) && (CUR_CHAR <= 0xFF))){
            APPEND_CHAR(CUR_CHAR);
            NEXT();
    }
#endif


UNICODEが使用されている場合はこの部分の処理が行われないようにする必要があります。
要は、SJISの2バイトコードの範囲が入ってきたらその次の文字も利用するという感じになります。
これで少なくとも"ソース"という文字列は出力できるようになるはずです。


使う場面次第ですが、商業用のアプリでならUNICODE、同人などの趣味ならSJISでいいのではないかと思います。

スポンサーサイト
  1. 2006/11/04(土) 22:29:32|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:7
<<ゲームあれこれ | ホーム | ティルキッス レビュー>>

コメント

UNICODEについて・・

初めまして、Squirrel を最近始めたタカといいます。

もんしょの巣穴さんで大変お世話になっています。
ありがとうございます。

おまけを見させていただいて UNICODEによるデバッグプリントにチャレンジしたのですが、
C++言語側のプログラムでどうしても日本語を含めると文字化けしてしまいます。

色々と試してみたのですが、うまくいきません。

デバッグしてみたところ
Squirrel のprintfunc関数の受け渡しまでは問題なく文字が入っています、
表示する際にvwprintf(s, arglist);では ????と表示されます。
英数字のみの場合は問題ありません。

もし何かご存じでしたらお助けください。
お忙しい中すいません。
  1. 2007/05/15(火) 23:54:04 |
  2. URL |
  3. タカ #ReOT891Y
  4. [ 編集]

vwprintf() がおかしいっぽい

始めましてタカさん。Monshoです。
忙しい私に代わって知り合いが調べてくれました。
症状はやっぱりタカさんと同じようです。
ただ、Squirrelから引っ張ってくる文字列以外でもvwprintf() はおかしな出力をするらしいので、vwprintf() が問題のようです。
私がこの記事を書いたときはVS6を使用していたので、VS2005だとおかしくなるのかもしれません。
それ以上はまだ調べられていないので、週末にでも調べてみます。
  1. 2007/05/17(木) 23:06:29 |
  2. URL |
  3. Monsho #6x2ZnSGE
  4. [ 編集]

setlocale()を使用する

wprintf() や vwprintf() はそのままだと日本語表示がおかしくなります。
ロケール情報を日本語にしてやれば問題ないらしいです。
wprintf() を使う前に

setlocale( LC_ALL, "Japanese" );

を呼んでください。ロケールを日本語にセットします。
また、実行環境に依存させるには

setlocale( LC_ALL, "" );

でOKです。日本語環境ならこれで日本語が出力されます。
  1. 2007/05/19(土) 15:08:11 |
  2. URL |
  3. Monsho #6x2ZnSGE
  4. [ 編集]

Monshoさん、知り合いの方、調べていただいてありがとうございます。

Monshoさんのコメントの通り、ロケールを日本語にセットで無事に解決いたしました。
本当に助かりました、ありがとうございました。

ロケール情報とは盲点でした。
マルチバイト文字関連かと思い、変換してみたり色々とやってたのですが、見当違いでした。

お忙しい中本当にありがとうございました。
また、お世話になるかも知れません、その際にはよろしくお願いします。
  1. 2007/05/20(日) 01:56:53 |
  2. URL |
  3. タカ #-
  4. [ 編集]

SQUNICODE?

最近、Squirrelを使ってみようと試行錯誤している者です。

UNICODE対応にする場合、
#define UNICODE
ではなく、
#define SQUNICODE
ではないのでしょうか?
version 2.1.1です。
  1. 2007/06/08(金) 20:03:08 |
  2. URL |
  3. TOBY #-
  4. [ 編集]

すみません。
Squirrel 2.1 リファレンスマニュアル
http://muffin.cias.osakafu-u.ac.jp/~matumoto/cgi-bin/xt.cgi?prog/squirrel_lang

によると、
#define _UNICODE
のようですね。
  1. 2007/06/08(金) 20:40:44 |
  2. URL |
  3. TOBY #-
  4. [ 編集]

修正しました

確かに _UNICODE が正しいようです。
記事のほうを修正しました。
報告、ありがとうございます。
  1. 2007/06/09(土) 01:47:30 |
  2. URL |
  3. Monsho #6x2ZnSGE
  4. [ 編集]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://monsho.blog63.fc2.com/tb.php/49-b1b29695
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

monsho

Author:monsho
ゲームプログラマ?

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。