HSP3dishでの文字表示と文字コードの取得
ねこずき 2013/7/16(Tue) 20:47:08|NO.55710
HSP3dishで文字表示モジュールを作ってるのですが
windows上では動くのですが実機では動かないようです(実機実所持)
wpeekで文字コードを取っていたのですが
androidはUTF-8で3バイト文字なので読み取れないと言う根本的な原因でした。
androidで文字コードを取得するにはどうしたらいいのですか?
moji="あ"
x=peek(moji,0)
y=peek(moji,1)
z=peek(moji,2)
こんな感じでしょうか?
手元に実機がないので検証できません。
この後もどう繋げていばいいのか,,,
とりあえず作ったのを上げておきます。
パスはhspmesです。
http://u3.getuploader.com/todo/download/21/ex_mes.zip
さか 2013/7/16(Tue) 21:51:41|NO.55713
なにかアプリを作ってて全角文字表示が出来ないために作成してるのですか?
それとも全角文字表示するモジュールを作るのが目的ですか?
前者であれば、まだ使ったことないですが「しろくまねこ」さんが文字の画像表示モジュールを公開してますよ。
http://www.geocities.jp/simakuroneko646/
早く対応してほしいと思ってます。試してないですが最新のベータでもまだ対応してないですよね?
しまくろねこ(おにいさん) 2013/7/16(Tue) 23:35:26|NO.55719
こんにちわ。
>さかさん
HSP側で文字表示が早くできるといいですよね。
ねこずきさんが作られようとしているのは漢字表示ができるモジュールのようです。
>ねこずきさん
こんにちわ。私の掲示板ではどうもです。
私は実機でチョコチョコと文字コード(UTF8)をコツコツ調べていったのですが、全部完成してから気づいたのですが、Web上でUTF8コードを調べればよかったと後悔しました。
でも自分で調べたことによって表示に必要な開始コードが分ったりしました。
で、どうやって "あ" 等の文字を取得しているかというと、
まず(*1)のサイトを見てみると、「E×」が「3バイト文字の開始バイト(漢字はおおむねこれで開始)」となっております。
次に(*2)と(*3)のサイトを見ると、例えば "あ" のコードを見ると、16進数表記で「E38182」となっております。(10進数だと:227(E3), 129(81), 130(82))
また、アルファベットの "A" のコードを見ると、16進数表記で「EFBCA1」となっております。(10進数だと:239(EF), 188(BC), 161(A1))
mod_picmesの場合は、半角全角の「英数字/記号/ひらがな/カタカナ」しか使用しません。ここで何が言いたいかというと、「英数字/記号/ひらがな/カタカナ」のUTF8コードは、1バイト目が「227」もしくは「239」になります。これは上記で言っている開始の「E×」のことです。この値をpeek関数で1バイト目を取得し、合致していれば続けて2バイト目3バイト目と取得していきます。
3バイト目まで取得し、自前で用意しているテーブルを使用して文字を表示しています。
ただし、注意することがあります。
必ずしも全ての文字が3バイトになるわけではありません。
例えばアスキーコード(半角の英数字記号)はAndroid上でも1バイトです。
また、全角文字でも2バイトなどがあります。
カタカナに関しては特殊で、例えば半角で「パ」をWindows上だと2文字ですが、Android(UTF8?)上だと1文字扱いになります。つまり全角の「パ」と同じということです。UTF8コードも「パ」も「パ」も同じになります。
なので、Windows上とAndoird上とで処理を分けてあげると良いかと思います。
(*1)
UTF-8コード表(1)
http://www.seiai.ed.jp/sys/text/java/utf8table.html
(*2)
UTF-8コード表(2)
http://www.seiai.ed.jp/sys/text/java/utf8table2.html
(*3)
Unicode対応 文字コード表
http://ash.jp/code/unitbl21.htm
参考になるか分りませんが、以下のソースをAndroidで実行すると結果は次のようになります。
len = 3
peek = 227, 129, 130
wpeek= 33251, 227, 129, 130
lpeek= 8552931, 227, 129, 130
#include "hsp3dish.as"
moji = "あ"
slen = strlen(moji)
redraw 0
color 0, 0, 0 : boxf
color 255, 255, 255
code_pk1 = peek(moji, 0)
code_pk2 = peek(moji, 1)
code_pk3 = peek(moji, 2)
code_wpk0 = wpeek(moji, 0)
code_wpk1 = wpeek(moji, 0) & 0xFF
code_wpk2 = wpeek(moji, 1) & 0xFF
code_wpk3 = wpeek(moji, 2) & 0xFF
code_lpk0 = lpeek(moji, 0)
code_lpk1 = lpeek(moji, 0) & 0xFF
code_lpk2 = lpeek(moji, 1) & 0xFF
code_lpk3 = lpeek(moji, 2) & 0xFF
mes "len = " + slen
mes "peek = " + code_pk1 + ", " + code_pk2 + ", " + code_pk3
mes "wpeek= " + code_wpk0 + ", " + code_wpk1 + ", " + code_wpk2 + ", " + code_wpk3
mes "lpeek= " + code_lpk0 + ", " + code_lpk1 + ", " + code_lpk2 + ", " + code_lpk3
redraw 1
stop
Windows上でAndroidのアプリを起動できるエミュレーターも複数存在しているようなので、そちらを試してみるのはいかがでしょうか?
ねこずき 2013/7/17(Wed) 23:12:35|NO.55724
>さかさん
picmesで平仮名ばかり見てたらゲシュタルト崩壊してきたので
好きなフォントで漢字を表示させたいと思ったので。
あと1文字づつのスライド表示も。
>しまくろねこさん
結局はしろくろねこさんに聞くことに(藁)
おかげさまで大分、分かってきました。
こんな感じでUTF-8の文字コードが取得できれば完成しそうです。
redraw 2 : color ,,200 : boxf : color 255,255,255
in_txt="あaアbうcえdお"
repeat
z=peek(in_txt,count)
byte=0
switch plat_form
;Windows上の動作の場合
case PLATFORM_WINDOWS
if (z>=128) : byte=2
if (z> 32)&(z<=127) : byte=1
if (z>160)&(z<=223) : byte=1
swbreak
;android上での動作
case PLATFORM_ANDROID
;32(20)から127(7F)は1バイト文字
if (z>=32)&(z<=127) : byte=1
;192(C0)から223(DF)は2バイト文字
if (z>=192)&(z<=223) : byte=2
;224(E0)から239(EF)は3バイト文字
if (z>=224)&(z<=239) : byte=3
swbreak
swend
if byte=0 : break
;改行"\n"は2バイト?
if strmid(in_txt,count,2)="\n" {
ix =x1 : iy+=high
count+=2
continue
}
Moji=strmid(in_txt,count,byte)
CODE="" : repeat byte : CODE+=strf("%x",int(peek(moji,cnt))) : loop
mes Moji+"("+byte+"byte)"
mes "16進 "+code
mes "10進 "+int("$"+code)
count+=byte
loop
redraw 1
stop
さか 2013/7/18(Thu) 23:45:56|NO.55743
なるほど漢字表示でしたか。
漢字となると壮大ですね。
完成したら是非公開してください(^^
ねこずき 2013/7/19(Fri) 20:42:18|NO.55766
たぶん処理は出来ているの思うんですけど、どうでしょう。
http://u3.getuploader.com/todo/download/22/ex_mes.zip
エミュレータだと画像が真っ白なんで文字が合ってるか分かりません。
実機で確認してもらえたら、ありがたいです。
しまくろねこ(おにいさん) 2013/7/19(Fri) 23:10:38|NO.55768
こんにちわ。
よく出来てますね。自分もフリーのフォントがあることを知っていれば挑戦してみたかったです。
サンプルをAndroid実機でテストしてみました。以下が結果です。
使い方がよく分りませんでしたが、
FONTNAME="m_setofont"
FONTNAME="misaki"
のコメントを付けたり外したりして交互にテストしてみました。
sample.hsp
FONTNAME="misaki"・・・起動し動作したが、「exmes Moji,2」の部分が動作がWindows上と異なる。
(文字の表示される位置がWindows上と異なる)
sample2.hsp
FONTNAME="m_setofont"・・・起動直後に落ちる。
FONTNAME="misaki"・・・起動し動作するが、「exmes Moji,2」の部分の動作がWindows上と異なる。
(文字の表示される位置がWindows上と異なる)
また「たたかう〜逃げる」の項目をタップすると動作がWindows上と異なる。
(文字の表示される位置がWindows上と異なる+「戦わなきゃ現実と…」等のメッセージ以外の文字や描画内容が全て消えてしまう)
sample3.hsp
FONTNAME="m_setofont"・・・起動直後に落ちる。
FONTNAME="misaki"・・・起動直後に落ちる。
サンプルをAndroidで動かした感想としては、文字(漢字)自体はちゃんと表示されてるかと思います。
ただWindows上とAndroid上だと処理の結果が多々異なることがあります。(今回ねこずきさんが作られたものに限らず)
なので、エミュレーターで動作が難しいということであれば、比較的安いAndroidタブレット端末を御購入されたほうが確実にテストが行なえるかと思います。
ねこずき 2013/7/22(Mon) 22:27:26|NO.55830
しろくまねこさんありがとうございます。
文字自体はなんとか表示されてる様で一応の目的達成です。
マニュアルをよく読んだら
ユーザー定義関数のパラメーター省略。
#defcfunc内でのwait、awaitの未対応。
ファイル名は12バイト内で。
が原因のエラーがあるらしいですね。
もろに当てはまって、よく読めって話です。
上のをエラーを回避して、ロード時間を短縮したので
フォント切り替えが瞬時に行えるようになりました。
http://u3.getuploader.com/todo/download/23/ex_mes.zip
PCで動けば実機でも動くだろうと思っていたのですがそう簡単ではないみたいですね。
PCでテストプレーが出来ないなら、しばらく中断しかないか。
ある程度でも動くエミュはないものか…
>自分もフリーのフォントがあることを知っていれば挑戦してみたかったです。
いや、ぜひ作ってほしいです。自分はこれ以上は難しいと思います。
ttfファイルをBMFontでpng出力するしかないですが
改変と自由配布OKなフォントなら大丈夫じゃないですかね。
しまくろねこ(おにいさん) 2013/7/25(Thu) 20:35:29|NO.55922
こんにちわ。
> BMfont
こんな便利なソフトあったんですね。
ねこずきさんが作られた今、作る意味があるのか分かりませんが、フリーフォントを見つけてきたので今更ですが漢字第1と第2水準を含んだものを作ろうと思います。
BMfontから出力されたテキストファイルに、文字IDとその文字の座標が自動的にセットされているので、恐らくですがねこずきさんと同じ作りになると思います。