ほとんどの人にはわからない
スーパーマニアック日記はじまるよー\(^O^)/
BDSV3の設定ファイルは、
ワケありでUTF-8で保存しようかなと思ったんですが
HSPではShift-JISが基本コードであるため
そのままでは使えません。
しかし、かろうじでUnicode(UTF-16)も扱えるので
一旦UTF-8をUnicodeに変換しておけば
たとえShift-JISで出せない文字が入っていても(ハートなど)
読み取ることができるわけです。
スクリプトはこんな感じ↓
#uselib "user32"
#func DrawText "DrawTextW" int,wptr,int,int,int
#uselib "kernel32"
#define CP_UTF8 65001
#func MultiByteToWideChar "MultiByteToWideChar" sptr,sptr,sptr,sptr,sptr,sptr
sdim h16,64
lpoke h16,0,38<<24|97<<16|254<<8|255
pos 50,50:sysfont 17
mes "Unicodeの文字を描画"
font msgothic,150,16
rect=ginfo_cx, ginfo_cy, ginfo_winx, ginfo_winy
DrawText hdc,varptr(h16),-1,varptr(rect),0
redraw
sdim h8,64
poke h8,0,239
poke h8,1,187
poke h8,2,191
poke h8,3,226
poke h8,4,153
poke h8,5,161
pos 200,50:sysfont 17
mes "UTF-8の文字をUnicodeと同じように描画"
font msgothic,150,16
rect=ginfo_cx, ginfo_cy, ginfo_winx, ginfo_winy
DrawText hdc,varptr(h8),-1,varptr(rect),0
pos 200,250:sysfont 17
mes "ですよねー。\n\nと言うわけで変換して描画"
sdim h8to16,64
MultiByteToWideChar CP_UTF8, 0, varptr( h8 ), -1, varptr( h8to16 ), 255
font msgothic,150,16
rect=ginfo_cx, ginfo_cy, ginfo_winx, ginfo_winy
DrawText hdc,varptr(h8to16),-1,varptr(rect),0
redraw
stop
※追記:
ここででかすぎ6バイトといっていたが調べてみると
メモ帳などでUTF-8のテキストと判断するための
フラグが先頭3バイトを占領していることが判明、
つまり実質UTF-8でのハートの文字は3バイト※さらに追記:
Unicodeの方も先頭2バイトは判別フラグみたいです。
つまりUnicodeのハートは2バイトこれを実行するとこんな感じ。

とまあこんな感じでUTF-8の文字を描画することができました。
しかしここで問題が、
読み込むときはそれで良いですが、
保存する時はどうすれば良いのか・・・!?
変換部分のここ
MultiByteToWideChar CP_UTF8, 0, varptr( h8 ), -1, varptr( h8to16 ), 255
ここの第1パラメーターのCP_UTF8の部分を
Unicodeに該当する定数にすれば良いのかなと思いきや
MultiByteToWideChar 関数 - MSDN文字列をワイド文字列(Unicode)にマップします
定数 | 意味 |
---|
CP_ACP | ANSI コードページ |
CP_MACCP | Macintosh コードページ |
CP_OEMCP | OEM コードページ |
CP_SYMBOL | シンボルコードページ(42) |
CP_THREAD_ACP | 現在のスレッドの ANSI コードページ |
CP_UTF7 | UTF-7 を使った変換 |
CP_UTF8 | UTF-8 を使った変換 |
あれ、無い。これはもう他の方法を探すしかないなと思い
とりあえず
MultiByteToWideCharでググっていると

ん?
「WideCharToMultiByte」?
WideCharToMultiByte 関数 - MSDNワイド文字列を新しい文字列にマップします
逆版があるだと!?#uselib "user32"
#func DrawText "DrawTextW" int,wptr,int,int,int
#uselib "kernel32"
#define CP_UTF8 65001
#func MultiByteToWideChar "MultiByteToWideChar" sptr,sptr,sptr,sptr,sptr,sptr
#func WideCharToMultiByte "WideCharToMultiByte" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
sdim h8,64
poke h8,0,239
poke h8,1,187
poke h8,2,191
poke h8,3,226
poke h8,4,153
poke h8,5,161
pos 50,30:sysfont 17
mes "UTF-8の文字をUnicodeと同じように描画"
font msgothic,100,16
rect=ginfo_cx, ginfo_cy, ginfo_winx, ginfo_winy
DrawText hdc,varptr(h8),-1,varptr(rect),0
pos 50,170:sysfont 17
mes "ですよねー。\n\nと言うわけで変換して描画"
sdim h8to16,64
MultiByteToWideChar CP_UTF8, 0, varptr( h8 ), -1, varptr( h8to16 ), 255
font msgothic,100,16
rect=ginfo_cx, ginfo_cy, ginfo_winx, ginfo_winy
DrawText hdc,varptr(h8to16),-1,varptr(rect),0
pos 50,300:sysfont 17
mes "無事描画成功!じゃあ今度は戻してみよう!"
sdim h16to8,64
WideCharToMultiByte CP_UTF8, 0, varptr( h8to16 ), -1, varptr( h16to8 ), 255, 0, 0
font msgothic,100,16
rect=ginfo_cx, ginfo_cy, ginfo_winx, ginfo_winy
DrawText hdc,varptr(h16to8),-1,varptr(rect),0
redraw

,,x-ー:: ":::::
,x '"::::::::::::::::::::
,、'":::::::::::::,, x-‐ ァ:
,,x '"::::::,,、- '" |:::
`"i`ー'" ヾ
! 、 、,,,,,,,,,;;;;;;;;;彡ミ
|,,,,ノi `ーヾ;; '"----、
ヾ::ヽ -┴'~
~|:/ ' ' ' `ー ' "'"
/_
l '' ) i
ヽ,,、'~` U
゙, __ ,-、_,ノ`
|/ ゙, `'" ,,y
|/ 彡 ゙、`-'"
/|/ i
/ ! ,, -'"
| `ー '"|::
| /|||ヽ
/|||||/心
|ヾ/ /`ー
というわけで無事にUTF-8が扱えそうです^q^
Web拍手レス
なるほど、早速やってみようと思います。
DDR Xはリミックス解禁したんですねー。
結局最後までクリアできませんでしたが。
○の中には⑨が入ると思いますw(
らのっちぇさん)
改めてみるとセイバーリミ鬼の途中50連近くの部分が
人間業じゃない気がしますねーw
今日やりに行こうかなと思いましたけど
風邪治らないしインフルで外出控えるよう言われてるし雨だしで
多分無理な予感w
雑談劇場の「背景の謎1」見てたんですけど、
やっぱりH500ってトムさんが「HELP!」って言おうとして
最初の部分を言いにくくて、「h...h.h....(ry」
って500回も言ったんですよね?(D.J.Sin さん)
CATASTROPHEの文字のとおり大惨事に見舞われた
トムさんが必死になって言ったわけですよっ!
[日記マンガ] [HSP]