全角英数のみ半角にする方法

strconvの使い方はわかるのですが、全角英数のみ半角にしたいのですが、そのような方法はあるのでしょうか? str = “あいうえお bcd 139482 カタカナ” をstrconvを使って変換するとカタカナまで半角になってしまいます。 これを防ぎたいと思います。よろしくお願いします。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク Yahoo!ブックマークに登録

コメント

  1. kobayashi より:

    こんにちは。

    STRCONV関数は全角文字を半角文字に変換してくれますが、
    その際に英数字やカタカナを判別せずに、まとめて変換してしまいます。

    この問題はニーズがあり、
    UWSC以外の言語でも解説しているページがありますが、
    何れも、別の処理を間に加えております。
    http://www.atmarkit.co.jp/fdotnet/dotnettips/1051anhankaku/anhankaku.html
    http://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_zenkakueisuji.html

    正規表現等を使う方法もありますが、
    今回はシンプルな例を下に載せてみます。

    単純に全角英数のみを半角にするスクリプトです。
    ポイントはREPLACE関数を使っていないところです。
    UWSCのREPLACE関数は大文字小文字を区別しないので、
    z→Zのような意図しない変換をしてしまう場合があります。
    ※OPTION SAMESTRで大文字/小文字の区別をするようにも可能。今回は割愛
    ここでは一文字一文字、文字コードを調べ、
    全角英数に当てはまる場合は、文字コードベースで変換をかけています。

    //////////////////////////////////////////////
    //サンプル文 大文字小文字のアルファベットを含みます
    myStr = "あいうえお bcd 139482 カタカナ ABCD"
    
    //変換結果を出力します。今回の変換方法は自作関数化しています
    print CONVSTR(myStr)
    
    //全角の英字を半角にする自作関数
    FUNCTION CONVSTR(str)
    
    //一文字一文字チェックするので、全体の長さを取得
    len = LENGTHB(str)
    
    //結果を格納する変数
    newStr = ""
    
    FOR A = 1 TO len
      //一文字取得
      letter = copy(str,A,1)
    
     //ASC関数で文字コードを調べる
      codeNo = ASC(letter)
    
      //文字コードが該当する場合に変換 全角大文字:65313~65338(A~Z)、全角小文字:65345~65370(a~z)
       IFB (codeNo >= 65313 AND codeNo <= 65338) OR (codeNo >= 65345 AND codeNo <= 65370)
         //該当コード番号から65248をマイナスすることで半角英字に変換 65~90(A~Z)、97~122(a~z)
         letter = CHR(codeNo - 65248)
       ENDIF
      //文字列を連結
      newStr = newStr + letter
    NEXT
    
    RESULT = newStr
    FEND
    //////////////////////////////////////////////
    
    • roadagain より:

      ご回答ありがとうございます。秀丸エディタを使用しているのですが、秀丸では簡単に英数字を半角に変換できるので、uwscでも簡単にできると思っていたのですが、そうではないんですね。

      filter “” , “ToHankakuAlnum”;

      文字コードの事は今まで全く気にしたことが無かったのですが、ご教授頂いたコードでやりたかった事を実現できそうです。
      ご教授頂いた後にgoogleで調べたら、linears様のサイトでも変換が載っていました。
      http://www.nagomi-jp.net/~liners/eisuuhenkan.htm

      大変勉強になりました。ありがとうございました!!


このページの先頭へ