HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0523
流星群2バイト文字を全て弾く方法。strtrim等。7解決


流星群

リンク

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]","")



ONION software Copyright 1997-2023(c) All rights reserved.