(*1)
;--------------------------------------------
; 開始
;--------------------------------------------
#include "hsp3dish.as"
setcls 1, $000000
color 255, 255, 255
dat = ""
notesel dat
noteload "test.txt"
*main
redraw 0
get_tx = ""
noteget get_tx, 0
pos 0, 0
if get_tx == "A" {
mes "[A]と同じです"
} else {
mes "[A]と違います"
}
get_tx = ""
noteget get_tx, 1
pos 0, 50
if get_tx == "あ" {
mes "[あ]と同じです"
} else {
mes "[あ]と違います"
}
redraw 1
await 16
goto *main
;--------------------------------------------
; 終わり
;--------------------------------------------
(*2) test.txt
------- A あ -------
結果はこうなると思います。
[A]と同じです
[あ]と違います
なぜこうなるのでしょうか?
実は、Dish Helperでビルドされる際のソース内の文字列に関係があります。
通常のHSP(Windows上で動作する)は、文字コードはS-JISで処理されておりますが、Dish Helperでビルドされたアプリは内部の文字列の文字コードは全てUTF-8に変換されております。
また、DPMファイルにS-JISのテキストファイルを含めてもDPMファイル内のファイルは特に変換はされません。
感の良い方はここで気づいたと思います。
答えは、ソース内の「if get_tx == "あ"」の「あ」とテキストファイル内の「あ」は全くの別のものということです。
先ほども書きましたが、Dish Helperでソースをビルドするとソース内部の文字列は全てUTF-8の文字コードに変換されます。
もう少し具体的に書きますと、
S-JISの「あ」の文字コード = 1バイト( 130 ), 2バイト( 160 )
UTF-8の「あ」の文字コード = 1バイト( 227 ), 2バイト( 129 ), 3バイト( 130 )
というふうになります。
それでは、文字列をif文などで比較したい場合どうすればよいのか?
一番確実な方法としては、DPMファイルに含ませるテキストファイルをUTF-8で保存してからDish Helperでビルドをする方法です。
もう一つの方法としては、プログラム内で文字コードを書き換えて自前で文字を変換する方法です。
どちらの方法も利点と欠点がありますので自分のやりやすい方法で行うとよいでしょう。
ただし、「文字の変換ってどうやるの?」という人は、前者の方法(テキストエディターなどでUTF-8で保存したものをDPMファイルに含ませる)てビルドするようにしましょう。
0 件のコメント:
コメントを投稿