« Windows10でふすま紙を透明にする | トップページ | 16進数の表記 »

2017年4月12日 (水)

文字コードが全角文字かどうか判定する

QXエディタのマクロでカーソル位置の文字が全角かどうか判定する方法について説明します。文字コードは ShiftJIS です。このマクロで全角と判定されれば、その文字は、かならず日本語で使われる漢字、ひらがな、またはカタカナです。ただし半角カタカナは無視します。

《注》 unicodeは、日本語、中国語、韓国語でしか使われない漢字がごっちゃにならんでいて、日本語だけをすっきり区別することはできないそうです(未確認)。

マクロ

proc main
  if @hwnd = 0 then exit proc
  dim cursor_code$
  dim reverse'= boolian value 真偽値
  cursor_code$ = "&H" + left$(hex$(@code),2)
  reverse = (val("&H81") <= val(cursor_code$)) and (val(cursor_code$) <= val("&H9f")) _
  or (val("&He0") <= val(cursor_code$)) and (val(cursor_code$) <= val("&Hfc"))
  if reverse = -1 then
    call msgbox("全角文字です")
  elseif reverse = 0 then
    call msgbox("全角文字ではありません")
  else
    exit proc
  end if
end proc

ShiftJIS の全角文字

ShiftJIS で全角文字にあたるのは、文字コードを 16進数で表したとき、
上2桁(上位バイト)が 81 から 9f まで、および、e0 から fc までの範囲です。
文字コード表 - 日本語 (シフト JIS) - CP932 - UIC

マクロ

QXのマクロは @code でカーソル位置の文字コードを取得できますが、これは 10 進数なので、16 進数に変換し、上2桁を切り取ります。その数字の頭に、16 進数であることを表す &H を加え、その文字列を数値に変換して大きさをくらべる……という手順をとります。

まとめると、
カーソル位置の文字コードを取得(10進数)
16進数に変換
上2桁を切り取る
頭に &H をつける
数値に変換
大きさをくらべる

マクロの上から順に説明します。

if @hwnd = 0 then exit proc

文書を一つも編集していないなら終了(カーソル位置が存在しないのでマクロを実行できない)。

cursor_code$ = "&H" + left$(hex$(@code),2)

hex$(@code)    @codeで得られた文字列(10進数)をhex$関数で16進数に変換。
left$(hex$(@code),2)    16進数の左側2文字を切り取る。

"&H" + left$(hex$(@code),2)

切り取った2文字の前に"&H"をつけて16進数であることを明示する。
cursor_code$ = "&H" + left$(hex$(@code),2)
上の文字列を cursor_code$ に代入。

数字の前に"&H"をつけて16進数であることを明示することについての、くわしい説明は、こちら。
16進数の表記

  reverse = (val("&H81") <= val(cursor_code$)) and (val(cursor_code$) <= val("&H9f")) _
  or (val("&He0") <= val(cursor_code$)) and (val(cursor_code$) <= val("&Hfc"))

↑↑↑↑ カーソル位置の文字コードを16進数で表したとき、上2桁(上位バイト)が 81 から 9f まで、または、e0 から fc までの範囲であるかどうかを判断。

文字列が長いので2行に分けてあります(論理行で2行)。マクロをつぎの行へ続ける

  reverse = (val("&H81") <= val(cursor_code$) <= val("&H9f"))
↑↑↑↑ これはダメ。比較したい数値の両側に不等号を置くことはできません。うっかりやってしまうまちがい。比較は一つずつおこない、and や or でつなぎます。

  if reverse = -1 then
    call msgbox("全角文字です")
  elseif reverse = 0 then
    call msgbox("全角文字ではありません")
  else
    exit proc
  end if

↑↑↑↑ これは「全角文字です」、「全角文字ではありません」とメッセージボックスを出しますが、実際に使うときは、この部分に実行したい動作が入ります。

《注》 この記事はまだ書きかけです。

 
QXエディタ入門

 ネット検索では一部しかヒットしません。記事は目次から探してください。
   記事の訂正などの最新情報は、こちら。総合案内(おしらせ)

                  ┏よくある質問
                  ┃QXの設定
                  ┃標準設定のQXを使う
       すべての目次━╋QXを使う
                  ┃マクロ
                  ┃QTClip QGREP どこでもホイール
                  ┗パソコンが苦手なかたへ

   QXエディタ入門からGoogleで
   サイト内検索のコツ

 

|

« Windows10でふすま紙を透明にする | トップページ | 16進数の表記 »