2月が最後の投稿でしたね^^;
WinXPのサポートが来年切れ、WindowsゲームでもXPの対応をしなくなってきましたね。そして、まだまだ現役のDirectX9ですが、そろそろ自分としてはDirextX11に移行していこうと思います。
それに伴い、いままでSquirrelというすばらしいスクリプトを使っていましたが、今現在Squirrelと比べると文字処理に弱いが数値に強いAngelScriptに移行しようとしています。
この辺のベンチマークは海外でみつけることができたので、AngelScript悪くないな~っておもってね(-.★
ただ!AngelScliptは、ShiftJISに対応していない・・・ってことは、使えば必ず日本語の文字化けは起きる!
さぁ、どうしたものか・・・・と思ったが、検索すると数件、ShiftJISを対応する方法が書いてあった、だが、ちょっとAngleScriptのバージョンが古かった・・・
今、AngelScript 2.27.1 (August 16th, 2013)が最新
よし、では現バージョンでの修正箇所をメモ代わりにかいておく(-.☆
予めいっておくが、修正したことによって何らかのトラブルが起きてもkaoken一切責任持たないからな!自己責任でよろしく
あと、何の努力もしないでわかりません、教えてくださいと言う「その幻想をぶち殺す」のでw
はぃ、テンション下がるようなことはここまで、簡単ではあるけど修正方法を書くぞ
これは何?いいえケフィ・・・・ゲホゴホ
見ての通り、1バイト目がShiftJISの範囲を表すものかどうかをチェックする物です。
こいつは、適当にヘッダファイル作ってくださいな。
続いては、as_tokenizer.cppファイルの329行付近ある、▼ 修正とある部分を修正してくれ!IsSJIS関数が、面倒ならそのまま文字チェック判定を貼り付けてもOKアルね
最後に、as_compiler.cppファイルの7649行付近の▼ 修正とある部分を同じく修正!
どう、簡単でしょ?
これで修正終わり、と言いたいが、プリプロセッサにAS_DOUBLEBYTE_CHARSETを定義してからコンパイルしてくれ!
使うときには、
これで終わり!
次回へ続く→AngelScript:ShitJISで文字列リテラルUTF16対応
WinXPのサポートが来年切れ、WindowsゲームでもXPの対応をしなくなってきましたね。そして、まだまだ現役のDirectX9ですが、そろそろ自分としてはDirextX11に移行していこうと思います。
それに伴い、いままでSquirrelというすばらしいスクリプトを使っていましたが、今現在Squirrelと比べると文字処理に弱いが数値に強いAngelScriptに移行しようとしています。
この辺のベンチマークは海外でみつけることができたので、AngelScript悪くないな~っておもってね(-.★
ただ!AngelScliptは、ShiftJISに対応していない・・・ってことは、使えば必ず日本語の文字化けは起きる!
さぁ、どうしたものか・・・・と思ったが、検索すると数件、ShiftJISを対応する方法が書いてあった、だが、ちょっとAngleScriptのバージョンが古かった・・・
今、AngelScript 2.27.1 (August 16th, 2013)が最新
よし、では現バージョンでの修正箇所をメモ代わりにかいておく(-.☆
予めいっておくが、修正したことによって何らかのトラブルが起きてもkaoken一切責任持たないからな!自己責任でよろしく
あと、何の努力もしないでわかりません、教えてくださいと言う「その幻想をぶち殺す」のでw
はぃ、テンション下がるようなことはここまで、簡単ではあるけど修正方法を書くぞ
inline bool IsSJIS(unsigned char c) { return ( ((c>=0x81)&&(c<=0x9f)) || ((c>=0xe0)&&(c<=0xfc)) ); }
これは何?いいえケフィ・・・・ゲホゴホ
見ての通り、1バイト目がShiftJISの範囲を表すものかどうかをチェックする物です。
こいつは、適当にヘッダファイル作ってくださいな。
// Normal string constant tokenType = ttStringConstant; char quote = source[0]; bool evenSlashes = true; size_t n; for( n = 1; n < sourceLength; n++ ) { #ifdef AS_DOUBLEBYTE_CHARSET // Double-byte characters are only allowed for ASCII // ▼ 修正 if( IsSJIS(source[n]) && engine->ep.scanner == 0 ) //if( (source[n] & 0x80) && engine->ep.scanner == 0 ) // ▲ 修正 { // This is a leading character in a double byte character, // include both in the string and continue processing. n++; continue; } #endif if( source[n] == '\n' ) tokenType = ttMultilineStringConstant; if( source[n] == quote && evenSlashes )
続いては、as_tokenizer.cppファイルの329行付近ある、▼ 修正とある部分を修正してくれ!IsSJIS関数が、面倒ならそのまま文字チェック判定を貼り付けてもOKアルね
// Process escape sequences asCArray<char> str((int)cstr.GetLength()); for( asUINT n = 0; n < cstr.GetLength(); n++ ) { #ifdef AS_DOUBLEBYTE_CHARSET // Double-byte charset is only allowed for ASCII and not UTF16 encoded strings // ▼ 修正 if( IsSJIS(cstr[n]) && engine->ep.scanner == 0 && engine->ep.stringEncoding != 1 ) // if( (cstr[n] & 0x80) && engine->ep.scanner == 0 && engine->ep.stringEncoding != 1 ) // ▲ 修正 { // This is the lead character of a double byte character // include the trail character without checking it's value. str.PushLast(cstr[n]); n++; str.PushLast(cstr[n]); continue; } #endif
最後に、as_compiler.cppファイルの7649行付近の▼ 修正とある部分を同じく修正!
どう、簡単でしょ?
これで修正終わり、と言いたいが、プリプロセッサにAS_DOUBLEBYTE_CHARSETを定義してからコンパイルしてくれ!
使うときには、
asIScriptEngine* engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); // SJISが使用できるようにする r = engine->SetEngineProperty(asEP_SCRIPT_SCANNER, 0); assert( r < 0 ); r = engine->SetEngineProperty(asEP_STRING_ENCODING, 0); assert( r < 0 );
これで終わり!
次回へ続く→AngelScript:ShitJISで文字列リテラルUTF16対応