|
でるもんた・いいじまです。
いま書いているマクロの関係で、文字列変数の中にCP932の範囲外の文字が
入っていないかチェックする動作を実装しようとしているのですが、
ascii() 関数の挙動について質問があります。
---- サンプルコード ここから ----
// -*- shift_jis -*-
$BOM = "\uFEFF"; // U+FEFF BYTE ORDER MARK
message sprintf("ascii(BOM) = 0x%04X", ascii($BOM));
$HeavyHeart = "\u2764"; // U+2764 HEAVY BLACK HEART
message sprintf("ascii(HEART) = 0x%04X", ascii($HeavyHeart));
$ZERO = "\x00"; // ASCIIZ-String Terminator
message sprintf("ascii('\\0') = 0x%04X", ascii($ZERO));
---- サンプルコード ここまで ----
このマクロを実際に動かしてみると、
ascii(BOM) = 0x003F
ascii(HEART) = 0x8148
ascii('\0') = 0x0000
と表示されます。0x003Fは半角クエスチョンマーク、0x8148は全角
クエスチョンマークのコードです。codeキーワードと同様に3つとも
0が返ってくるかと思ったので、ちょっと驚いています。
これはサイトー企画さんのほうで想定されていた仕様でしょうか?
それとも、このへんの処理は Win32 APIの WideCharToMultiByte()
あたりに丸投げしていてそちらの仕様なので、ということになるん
でしょうか?
とりあえず私の目標は、「あらゆる文字が入っている可能性のある
文字列」を「非Unicodeアプリがファイル名として使用できる文字列」
に変換することなので、ascii() が何を返そうが困らないのですが、
ちょっと気になったので質問させていただきました。
#私の場合、変数の中身を1文字ずつ ascii() に渡して、ファイル名に
#使えないコードが返ってきたらその部分を代替の文字に差し替える、
#という処理を入念に実装するだけです。元の文字列は編集中の文面から
#採取するので、コントロールコードなども考慮する必要があります。
|
|