AngelScriptでShiftJIS対応するためのメモ

2月が最後の投稿でしたね^^;
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 );

これで終わり!
angel-script-testShiftJISで読み込んだ画像。Windowタイトルに反映

次回へ続く→AngelScript:ShitJISで文字列リテラルUTF16対応

コメント 

コメントを残す