[質問]機種依存文字の検索No.01606
プックン さん 00/11/15 13:56
 
機種依存文字の検索

機種依存文字を検索するのに、
    Shift-JIS の場合
    2byte文字 0x8540〜0x889E,0xEAA5,0xFCFCを検索しようとしています。
    2byte文字のHex指定がどうもうまくできなくて、直接文字を書いて
    下記のようなマクロを使っています。

//  サンプルマクロ
//          各文字code
//          (1):0x8540
//          (2):0x889E
//          (3):0xEAA5
//          (4):0xFCFC
//          (1)-(4)の文字は・のように表示されている
//            (1)(2)(3)(4)
//            ↓ ↓ ↓ ↓
    $find = "[・-・,・-・]" ;
    searchdown $find,regular;   //下方向検索
//  サンプルマクロ終わり

(1)
    サンプルマクロで実施すると、なぜかカンマ","を検出してしまいます。
    なぜでしょうか?

(2)
    直接文字を記入するのは、あとでみたときわかりにくいのでhexで
    指定したいのですが、
    1byteの文字をHexで指定して検索した場合は、うまく検索できるのですが
    2byteコードでは上手くできません。$findのところを下記のように
    変更しただけではだめなのでしょうか?

    $find = "[\\x8540-\\x889E,\\xEAA5-\\xFCFC]" ;
   
よろしくおねがいします。

[ ]
RE:01606 [質問]機種依存文字の検索No.01607
ENCODINGSHIFTJIS さん 00/11/15 14:40
 
>    2byte文字のHex指定がどうもうまくできなくて、直接文字を書いて
正規表現の動作は正常です、[]囲み内の解釈はその様なものなのです。
[]の外で使用できたエスケープ表現は使えないのもあります。
詳しくは 正規表現の書き方の説明を Web検索してください。
ソフトによって微妙な違いがあります。突っ込むといろいろ出てきます。
以下ではできた つもりです。
$find = "[\x85\x40-\x88\x9E\xEA\xA5-\xFC\xFC]" ;// 読みにくい ?
 searchdown $find,regular;   //下方向検索

[ ]
RE:01606 [質問]機種依存文字の検索No.01608
きいろいまふらあ さん 00/11/15 14:54
 
きいろいまふらあです。
やっと思い出した。

>    $find = "[・-・,・-・]" ;
>    サンプルマクロで実施すると、なぜかカンマ","を検出してしまいます。

[]内にカンマが入っているからでしょう。(^_^)
例えばアルファベットの大文字と小文字を検索する場合
[A-Za-z]と書きます。

>    $find = "[\\x8540-\\x889E,\\xEAA5-\\xFCFC]" ;

これだと「\」をエスケープしちゃってますね。
正規表現を使うためにエスケープさせているのだと思いますが、
これは逆効果です。
\\としてしまったおかげで、文字コード指定になってないです。

\のままにしておけば、正規表現の解釈をする前に実際の文字に
置き換わっている(というのも変な表現ですが)ので、
こんどはそもそもエスケープの必要がありません。

で、

$find = "[\x8540-\x889E\xEAA5-\xFCFC]";

とするのがよさそうなわけですが、うまくいきません。これは、

$find = "[\x85\x40-\x88\x9E\xEA\xA5-\xFC\xFC]";

とします。別解として

$find = "[" + char(0x8540) + "-" + char(0x889E) +
              char(0xEAA5) + "-" + char(0xFCFC) + "]";

なんてのもありでしょうかね。
ご参考まで。

[ ]
RE:01608 [質問]機種依存文字の検索No.01609
プックン さん 00/11/15 15:28
 
ENCODINGSHIFTJISさん,きいろいまふらあさん

ご指導ありがとうございました。
テストしたところ、お二人に教えていただいた方法で
期待の動作をしてくれました。
これで、やっと期待の動作をしたマクロがつくれそうです。

>[A-Za-z]と書きます。
いつも[A-Z,a-z]って書いてました。(^_^;)
まちがってたんですね。うーん、私はまだまだ勉強不足ですね。


[ ]