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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0917
魚犬全角英数字のみを半角変換4解決


魚犬

リンク

2017/9/17(Sun) 10:38:46|NO.81349

全角英数字のみを半角変換にしたいのですが、
以下の変換系のモジュールを使用するとどれも、
英、数字、カタカナの全角全てが半角になります。
カタカナのみ処理除外するということは出来ないでしょうか?


;***** 各種文字種の変換 (strmod03.hsp) ***** #module ;▼必要となるAPIや定数の定義 #uselib "kernel32.dll" #cfunc GetUserDefaultLCID "GetUserDefaultLCID" #cfunc LCMapString "LCMapStringA" int,int,int,int,int,int #deffunc charkindcnv var prm1,str prm2,int prm3 ls =strlen(prm2) : sdim pSrc,ls+1 nLen=(ls+4)*2 : sdim pDst,nLen pSrc = prm2 : if strlen(pSrc)==0 : return -1 nMode = prm3 : if (nMode<=0)|(nMode>5) : nMode=0 ;文字列の全角、半角、かな、カナ、大文字、小文字の変換 #define LCMAP_LOWERCASE $00000100 ;英大文字を小文字へ変換 #define LCMAP_UPPERCASE $00000200 ;英小文字を大文字へ変換 #define LCMAP_FULLWIDTH $00800000 ;半角文字を全角文字へ変換 #define LCMAP_HALFWIDTH $00400000 ;全角文字を半角文字へ変換 #define LCMAP_HIRAGANA $00100000 ;カタカナをひらがなへ変換 #define LCMAP_KATAKANA $00200000 ;ひらがなをカタカナへ変換 switch nMode case 0 : nFlags = LCMAP_LOWERCASE : swbreak case 1 : nFlags = LCMAP_UPPERCASE : swbreak case 2 : nFlags = LCMAP_FULLWIDTH : swbreak case 3 : nFlags = LCMAP_HALFWIDTH : swbreak case 4 : nFlags = LCMAP_HIRAGANA : swbreak case 5 : nFlags = LCMAP_KATAKANA : swbreak swend LCID=GetUserDefaultLCID() : if LCID==0 : return -1 ret=LCMapString(LCID,nFlags,varptr(pSrc),-1,varptr(pDst),nLen) if ret<=0 : sdim pDst,0 : sdim pSrc,0 : return -1 prm1=pDst sdim pDst,0 : sdim pSrc,0 return 0 #global ;***** Sample ***** ; 0 : 英大文字を小文字へ変換 ; 1 : 英小文字を大文字へ変換 ; 2 : 半角文字を全角文字へ変換 ; 3 : 全角文字を半角文字へ変換 ; 4 : カタカナをひらがなへ変換 ; 5 : ひらがなをカタカナへ変換 charkindcnv s,"あいうエオABC12345",3 : mes s stop



この記事に返信する


掘木

リンク

2017/9/17(Sun) 11:08:40|NO.81350

その文字列操作API関数はそういった細かい調整ができるものじゃなかったと記憶しているよ。
MSDNのページを読んで色々試せば多分無理。というか、無理だった記憶がある。


変換したい英数字に記号類が入るのかよくわからんが、
英数字なんぞ文字の種類が大したことないので、(記号込みで多く見ても96種)、
自前で1文字ずつ切り出して変形したほうが結果的に早いんじゃないかな。
文字コードを調べてさくさくっと。

処理速度を一切考慮しなくていいなら、これらの文字を全角から半角に変換するstrrep連打でもまぁできなくもない。



科学太郎

リンク

2017/9/17(Sun) 20:32:44|NO.81355


+----+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |番号|0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F| +----+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |8240|・|・|・|・|・|・|・|・|・|・|・|・|・|・|・|0| |8250|1|2|3|4|5|6|7|8|9|・|・|・|・|・|・|・| |8260|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P| |8270|Q|R|S|T|U|V|W|X|Y|Z|・|・|・|・|・| | |8280|・|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o| |8290|p|q|r|s|t|u|v|w|x|y|z|・|・|・|・|ぁ| |82A0|あ|ぃ|い|ぅ|う|ぇ|え|ぉ|お|か|が|き|ぎ|く|ぐ|け| |82B0|げ|こ|ご|さ|ざ|し|じ|す|ず|せ|ぜ|そ|ぞ|た|だ|ち| |82C0|ぢ|っ|つ|づ|て|で|と|ど|な|に|ぬ|ね|の|は|ば|ぱ| |82D0|ひ|び|ぴ|ふ|ぶ|ぷ|へ|べ|ぺ|ほ|ぼ|ぽ|ま|み|む|め| |82E0|も|ゃ|や|ゅ|ゆ|ょ|よ|ら|り|る|れ|ろ|ゎ|わ|ゐ|ゑ| |82F0|を|ん|・|・|・|・|・|・|・|・|・|・|・| | | | +----+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |番号|0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F| +----+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |8340|ァ|ア|ィ|イ|ゥ|ウ|ェ|エ|ォ|オ|カ|ガ|キ|ギ|ク|グ| |8350|ケ|ゲ|コ|ゴ|サ|ザ|シ|ジ|ス|ズ|セ|ゼ|ソ|ゾ|タ|ダ| |8360|チ|ヂ|ッ|ツ|ヅ|テ|デ|ト|ド|ナ|ニ|ヌ|ネ|ノ|ハ|バ| |8370|パ|ヒ|ビ|ピ|フ|ブ|プ|ヘ|ベ|ペ|ホ|ボ|ポ|マ|ミ| | |8380|ム|メ|モ|ャ|ヤ|ュ|ユ|ョ|ヨ|ラ|リ|ル|レ|ロ|ヮ|ワ| |8390|ヰ|ヱ|ヲ|ン|ヴ|ヵ|ヶ|・|・|・|・|・|・|・|・|Α| |83A0|Β|Γ|Δ|Ε|Ζ|Η|Θ|Ι|Κ|Λ|Μ|Ν|Ξ|Ο|Π|Ρ| |83B0|Σ|Τ|Υ|Φ|Χ|Ψ|Ω|・|・|・|・|・|・|・|・|α| |83C0|β|γ|δ|ε|ζ|η|θ|ι|κ|λ|μ|ν|ξ|ο|π|ρ| |83D0|σ|τ|υ|φ|χ|ψ|ω|・|・|・|・|・|・|・|・|・| |83E0|・|・|・|・|・|・|・|・|・|・|・|・|・|・|・|・| |83F0|・|・|・|・|・|・|・|・|・|・|・|・|・| | | | +----+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |番号|0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F| +----+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
このSJISコード一覧から全角の英数字は、
数字文字が「0x824F〜0x8258」、
英大文字が「0x8260〜0x8279」、
英小文字が「0x8281〜0x829A」の範囲です。

//------------------------------------------------------------------------------ // 全角英数字の半角変換 by 科学太郎 //============================================================================== // 新規作成日:2017-09-17 (日) 20:00:00 // 最終更新日:2017-09-17 (日) 20:28:00 //------------------------------------------------------------------------------ // @URL(http://hsp.tv/play/pforum.php?mode=all&num=81349)→「全角英数字のみを半角変換」 // @URL(https://msdn.microsoft.com/ja-jp/library/cc448045.aspx)→「IsDBCSLeadByte」 //------------------------------------------------------------------------------ #include "Kernel32.as" //-------------------------------------- // メイン部 //-------------------------------------- *Init ank1="0123456789" ank2="ABCDEFGHIJKLMNOPQRSTUVWXYZ" ank3="abcdefghijklmnopqrstuvwxyz" *Main screen 0,640,480,SCREEN_NORMAL|SCREEN_FIXEDSIZE syscolor 15:boxf:color:title "全角英数字の半角変換 by 科学太郎" ;変換 ZenToHanSample ;結果 mes s1 mes s2 stop //-------------------------------------- // 文字変換のサンプル //-------------------------------------- #deffunc ZenToHanSample sdim s1:s1="0123:ABCDEF:abcdef:0123:ABCDEF:abcdef:あいうえお:アイウエオ" sdim s2,1024 dim sn repeat strlen(s1) c=peek(s1,cnt) IsDBCSLeadByte c ;半角 if(stat==0){ poke s2,sn,c:sn++ continue } ;全角 d=peek(s1,cnt+1) k=(c<<8)|d if($824F<=k)and(k<=$8258):poke s2,sn,peek(ank1,k-$824F):sn++:continue(cnt+2) ;数字文字 if($8260<=k)and(k<=$8279):poke s2,sn,peek(ank2,k-$8260):sn++:continue(cnt+2) ;英大文字 if($8281<=k)and(k<=$829A):poke s2,sn,peek(ank3,k-$8281):sn++:continue(cnt+2) ;英小文字 ;その他 poke s2,sn,c:sn++ poke s2,sn,d:sn++ continue(cnt+2) loop poke s2,sn,$00 ;NULL文字 return //------------------------------------------------------------------------------ // End of sample213(全角英数字の半角変換).hsp //------------------------------------------------------------------------------

このような感じで自力で文字変換することになります。
低速ですが変換は出来ます。

もしも、高速処理を求めてる場合は HSP を使わないか、
変換処理だけを DLL ファイル化して HSP で呼び出すしか方法がないでしょう。



科学太郎

リンク

2017/9/17(Sun) 22:16:00|NO.81361

追記。

//------------------------------------------------------------------------------ // 全角英数字の半角変換(2) by 科学太郎 //============================================================================== // 新規作成日:2017-09-17 (日) 20:00:00 // 最終更新日:2017-09-17 (日) 20:28:00 // 最終更新日:2017-09-17 (日) 22:13:00 //------------------------------------------------------------------------------ // @URL(http://hsp.tv/play/pforum.php?mode=all&num=81349)→「全角英数字のみを半角変換」 // @URL(https://msdn.microsoft.com/ja-jp/library/cc448045.aspx)→「IsDBCSLeadByte」 //------------------------------------------------------------------------------ #include "Kernel32.as" //-------------------------------------- // メイン部 //-------------------------------------- *Main screen 0,640,480,SCREEN_NORMAL|SCREEN_FIXEDSIZE syscolor 15:boxf:color:title "全角英数字の半角変換(2) by 科学太郎" ;変換 ZenToHanSample ;結果 mes s1 mes s2 stop //-------------------------------------- // 文字変換のサンプル //-------------------------------------- #deffunc ZenToHanSample sdim s1:s1="0123:ABCDEF:abcdef:0123:ABCDEF:abcdef:あいうえお:アイウエオ" sdim s2,1024 dim sn repeat strlen(s1) c=peek(s1,cnt) IsDBCSLeadByte c ;半角 if(stat==0){ poke s2,sn,c:sn++ continue } ;全角 d=peek(s1,cnt+1) k=(c<<8)|d if($824F<=k)and(k<=$8258):poke s2,sn,(k-$824F+'0'):sn++:continue(cnt+2) ;数字文字 if($8260<=k)and(k<=$8279):poke s2,sn,(k-$8260+'A'):sn++:continue(cnt+2) ;英大文字 if($8281<=k)and(k<=$829A):poke s2,sn,(k-$8281+'a'):sn++:continue(cnt+2) ;英小文字 ;その他 poke s2,sn,c:sn++ poke s2,sn,d:sn++ continue(cnt+2) loop poke s2,sn,$00 ;NULL文字 return //------------------------------------------------------------------------------ // End of sample213b(全角英数字の半角変換).hsp //------------------------------------------------------------------------------
前回のサンプルでは、文字変換部分に無駄があったので、少し改良してみました。



魚犬

リンク

2017/9/17(Sun) 22:48:57|NO.81362

>掘木さん
strrepも考えたのですが、スマートじゃないので
既存のモジュールをいじってなんとか出来ないかなと思い質問させていただきました。
やはり単純に出来るものじゃなさそうですね。

>科学太郎さん
モジュールまで作っていただきありがとうございます。
サンプルコード非常に分かりやすく理解できましたので使えそうです。
ありがとうございました。



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