PowerShellで半角文字のリストを作ったり、半角全角文字の判定をするときの方法をまとめました。
数字から文字を作る
数字の世界であるパソコンの中で文字を表すために、文字コードというものがあります。
文字コードは歴史の中で様々な規格が生まれ、それだけで本一冊ができるほどのジャンルになっています。
特に日本語は漢字、カタカナ、ひらがな、さらにそこに半角、全角と考慮しないといけないことがいっぱい・・・。
本当にシステム屋泣かせです。
PowerShellでテキストファイルの文字列の置換をするときは文字コードに気を付けて! - 適材適所
今回は、いわゆる半角文字の一覧を作成するので、Windows環境ではお馴染みのShift-JISというコードを使っていきます。
ここで言う半角文字とは、1,u,J,サなどの1バイト文字とします。
Shift-JISでは半角文字は16進数の21~7EとA1~DFが割り当てられています。10進数で言うと0~127、161~223になります。これはPowerShellで簡単に確かめることができます。PowerShellでは16進数を次のように頭に0xとつけることで表すことができます。
#10進数の12 0xC
Shift-JISの半角文字は21~7E、A1~DFに割り当てられているので、それらは次のように表すことができます。
#21~7Eの配列 (0x21..0x7E)
#A1~DFの配列 (0xA1..0xDF)
数字から文字に変換するためには、.NETのSystem.Text.Encodingクラスを使います。
Shit-JISのEncodingクラスを取得し、GetStringメソッドで数字をデコードしてあげます。具体的には次のようにします。
#「ア」と出力される [System.Text.Encoding]::GetEncoding("Shift_JIS").GetString(0xB1)
半角文字のリストを作る
ここまでの知識を応用すればPowerShellで簡単に半角文字の一覧を作成することができます。
(0x21..0x7E)+(0xA1..0xDF)|foreach{[System.Text.Encoding]::GetEncoding("Shift_JIS").GetString($_)}
最初に配列を足し合わせます。そしてそれをforeachに渡して、それぞれデコードしてあげます。
16進と10進と半角文字の対比表を作る
余談ですが、それぞれの数字がどの文字と対応しているかは、次のコードを実行することでリスト化することができます。
#「16進:10進:文字」の順番で表示される (0x21..0x7E)+(0xA1..0xDF)|foreach{"$('{0:x}' -f $_):$($_):$([System.Text.Encoding]::GetEncoding("Shift_JIS").GetString($_))"}
半角文字のリストを使って半角全角判定に使う
ここまでのコードを使えば、文字が半角か全角かを簡単に判定できます。文字のリストは配列になるので、Containsメソッドを使うことできます。これを使えば配列内に該当の文字が含まれているかどうかを簡単に判定することができます。
$singlebytes=((0x21..0x7E)+(0xA1..0xDF)|foreach{[System.Text.Encoding]::GetEncoding("Shift_JIS").GetString($_)}) #True $singlebytes.Contains("a") #True $singlebytes.Contains("カ") #False $singlebytes.Contains("あ")
GetByteCountを使って判定した方が早い
ここまで色々書きましたが、判定するだけでしたら、こんな回りくどいことすることもなくEncodingクラスの.GetByteCountメソッドを使うことで対応することができます。
#True [System.Text.Encoding]::GetEncoding("Shift_JIS").GetByteCount("ア") -eq 1 #True [System.Text.Encoding]::GetEncoding("Shift_JIS").GetByteCount("a") -eq 1 #False [System.Text.Encoding]::GetEncoding("Shift_JIS").GetByteCount("あ") -eq 1
終わりに
PowerShellで半角文字の一覧を作成する方法と半角全角の判定を行う方法について紹介しました。
文字コードに関する文献やMicrosoftのドキュメント、その他について語ってくれているサイトで文字コードの情報に触れる度に、本当に文字コードは複雑で、またそれをコンピュータ上で表現させた先人たちは本当に凄いと感慨深いものがありますね。
でも、その複雑さゆえに、文字コードはいつも私を困らせています。そしてその度に世界が1つの文字コードに統一されて平和になればいいなと思っています。
というわけで、ここまでお読みいただき、ありがとうございました。