2バイト文字を全て弾く方法。strtrim等。
流星群 2013/5/23(Thu) 12:28:44|NO.54227
2バイト文字を全て弾きたいのですが、
全て弾くのは
strtrimで
SJISの2バイト文字全ての分除外処理をしないとならないのでしょうか?
2バイト文字をまとめて弾く方法はありますか??
inovia 2013/5/23(Thu) 13:07:00|NO.54230
#module
#uselib "msvcrt"
#cfunc _mbsbtype "_mbsbtype" var, int
#deffunc Remove2ByteChar var in, var out
sdim out, strlen(in)*2
i = 0
repeat strlen(in)
// 1バイト(1byte)の時は 0が返る
// 2バイト(2byte)の先行バイトの時は 1が返る
// 後続バイト(2byte)の時は 2が返る
if _mbsbtype(in, cnt) == 0{
poke out, i, peek(in, cnt)
i++
}
loop
return
#global
in = "アaイiウuエeオoアイウエオ"
Remove2ByteChar in, out
mes "in: "+in
mes "↓"
mes "out: "+out
こういうことがやりたいのかな?
1バイト文字か2バイト文字かを判定して、1バイト文字だったら書き込むという処理をすればOK。
http://hspdev-wiki.net/?String%2F%B2%FE%B9%D4#ze5fa230
ちなみに、2バイト文字を取り除くのが条件だったので、1バイト文字である半角カナは除去してません。
半角カナは 0xa1〜0xdf の範囲にあります。
http://charset.7jp.net/sjis.html
流星群 2013/5/23(Thu) 16:20:20|NO.54235
>>inoviaさん
ありがとうございます。
お陰でどういう風にするかわかりました。
後は自分の制作物に上手く組み込めるよう頑張ります。
チラ裏
やはり少し細かい命令になるとAPI使わなければいけないのですねー…
inovia 2013/5/23(Thu) 16:56:38|NO.54239
>やはり少し細かい命令になるとAPI使わなければいけないのですねー…
今回の処理であればAPIを使わなくても、同じことはできます。
http://hspdev-wiki.net/?String%2F%B2%FE%B9%D4#o681c775
Shift_JISで2バイト文字が使われている範囲が決まっているので、
その仕様にのっとれば同じ処理ができます。
ぴょぴょ 2013/5/23(Thu) 18:48:46|NO.54243
流星群さんへ。
高速漢字判定のサンプルを紹介します。
漢字判定テーブル(_ascTable)の部分を増やすことで
大文字、小文字、数字などを一発で判定してくれます。
// 漢字判定のマクロ関数
#define ctype iskanji1(%1) (_ascTable(%1) & CTYPE_KANJI1)
#define ctype iskanji2(%1) (_ascTable(%1) & CTYPE_KANJI2)
// 漢字判定の記号定数
#const CTYPE_KANJI1 (%0001) ;漢字文字の第1バイト目(0x81-0x9F,0xE0-0xFC)
#const CTYPE_KANJI2 (%0010) ;漢字文字の第2バイト目(0x40-0x7E,0x80-0xFC)
// メイン部
*Init
dim _ascTable,256
repeat (0x9F-0x81+1),0x81 : _ascTable(cnt)|=CTYPE_KANJI1 : loop ;0x81-0x9F
repeat (0xFC-0xE0+1),0xE0 : _ascTable(cnt)|=CTYPE_KANJI1 : loop ;0xE0-0xFC
repeat (0x7E-0x40+1),0x40 : _ascTable(cnt)|=CTYPE_KANJI2 : loop ;0x40-0x7E
repeat (0xFC-0x80+1),0x80 : _ascTable(cnt)|=CTYPE_KANJI2 : loop ;0x80-0xFC
*Main
msg="アaイiウuエeオoアイウエオ"
mes strf("変換前=[%s]",msg)
RemoveKanjiCode msg,msg
mes strf("変換後=[%s]",msg)
stop
// 漢字文字の取り除き処理
#deffunc RemoveKanjiCode var _buff_,str _string_
sdim _buff_,strlen(_string_)+1
sdim s : s=_string_
dim n
dim c
repeat strlen(s)
c=peek(s,cnt)
if ( iskanji1(c) ){
continue (cnt+2)
}
poke _buff_,n,c
n++
loop
return n ;長さを返す
ワザとモジュールにしてませんので、色々と遊んでみて下さい。
流星群 2013/5/23(Thu) 20:12:08|NO.54247
>>ぴょぴょさん
ありがとうございます。
難しいですが理解しようと色々いじってみています。
ぴょぴょ 2013/5/23(Thu) 21:15:58|NO.54249
追記。
次の3箇所を追加すると大文字、小文字、数字文字の判定が行えます。
いじくる時のヒントにどうぞ。
// 大文字,小文字,数字の判定関数
#define ctype isalnum(%1) (_ascTable(%1) & (CTYPE_UPPER|CTYPE_LOWER|CTYPE_DIGIT))
#define ctype isalpha(%1) (_ascTable(%1) & (CTYPE_UPPER|CTYPE_LOWER))
#define ctype isupper(%1) (_ascTable(%1) & (CTYPE_UPPER))
#define ctype islower(%1) (_ascTable(%1) & (CTYPE_LOWER))
#define ctype isdigit(%1) (_ascTable(%1) & (CTYPE_DIGIT))
// 大文字,小文字,数字の記号定数
#const CTYPE_UPPER (%00000100) ;英大文字(A-Z)
#const CTYPE_LOWER (%00001000) ;英小文字(a-z)
#const CTYPE_DIGIT (%00010000) ;数字文字(0-9)
// 初期化部
repeat 26,'A' : _ascTable(cnt)|=CTYPE_UPPER : loop
repeat 26,'a' : _ascTable(cnt)|=CTYPE_LOWER : loop
repeat 10,'0' : _ascTable(cnt)|=CTYPE_DIGIT : loop
【マクロ関数の説明】
isalnum(c) 英数字の判定
isalpha(c) アルファベットの判定
isupper(c) 大文字の判定
islower(c) 小文字の判定
isdigit(c) 数字の判定
以上。
GENKI 2013/5/23(Thu) 22:33:01|NO.54250
半角文字以外の文字列を空文字に置き換えてやればいいわけです。
正規表現を使うとシンプルに記述できます。
#include "mod_regexp.as"
a={"
太郎:50, 100, 70
一郎:30, 50, 60
花子:60, 40, 50
"}
mes replace(a,"[^ -~。-゜\r\n]","")