ぽぴ王子に怒られたので、こちらで。
Q.その文字が半角かどうかをわかる方法を教えてください。
A.Shift_JISに変換して1バイトか2バイトかでわかるよ。
本当か?
というか、もともとはShift_JISでのことを言っているのか?という問いかけで堂々めぐりしているわけだけど
http://bbs.wankuma.com/index.cgi?mode=al2&namber=6223
[Text.Encoding]::GetEncoding("shift_jis").GetBytes("㉑")
まるがこみ数字の21というやつです。UnicodeでいうとU+3251(10進12881)
これの結果は
PS C:\Users\localnaka> [Text.Encoding]::GetEncoding("shift_jis").GetBytes("?")
63
PS C:\Users\localnaka>
このように1バイトと判定されています。ちなみにU+3F
いわゆるはてなです。?
Unicode=>Shift_JIS変換する際に表現できる文字集合が違うために文字落ちが発生します。
この文字がはてな記号にマッピングされているという次第。
文字について0は半角で0は全角だなんて前時代的なことを、疑問も持たずに受け入れているということは、日本の文化の衰退を意味します。
日本語について日本の技術者はもっと向き合わなければいけないのです。
少なくとも私はそう考えています。
さっきのQに対する明確な回答は残念ながらUnicodeのままにすべての文字をまずはサーチして、Unicodeにあるが、Shift_JISに無い文字はどうするかを考える。
いわゆるASCII文字エリアを半角とみなす
などの処方が必要です。
独自で?へのマッピングでなく豆腐へのマッピングにするなどをおこなうのであれば、合成文字、サロゲートペアへの考慮も本来は必要です。