C#で文字列の全角と半角を判定・文字列の文字数とバイト数を利用

この記事でわかること
C#で文字列の全角と半角を判定する
C#のプログラムで文字列の入力やデータをチェックする際など、文字種の判定が必要になる事があります。
ここでは、C#で文字列の全角と半角を判定する方法を解説します。
文字列の文字数とバイト数を利用する
Shift_JISにおいて全角は2バイト、半角は1バイトで表します。それを利用して文字数の差により、文字列に存在する全角と半角の文字数を計算出来ます。
C#においてこれを判定する場合、具体的には、バイト数の取得にEncodingクラスのGetByteCountメソッドを使用します。この結果と文字列のLengthプロパティによって計算します。
Encodingクラスのインスタンス(ここでは「shiftjisEnc」とします)の作成は以下のようにします。
1 |
static Encoding shiftjisEnc = Encoding.GetEncoding("Shift_JIS"); |
文字列「chkStr」のバイト数を変数「chrByteNum」に代入する場合はGetByteCountメソッドを使用して以下のようにします。
1 |
int chrByteNum = shiftjisEnc.GetByteCount(chkStr); |
全角を判定する
Shift_JISにおいて全角文字は2バイト、半角文字は1バイトですから、全角文字1文字あたり1だけ文字数よりバイト数が上回る事になります。
よって全角文字数はバイト数から文字数を引けば計算できます。この計算結果を変数「numFullWidth」に代入するコードをC#では以下のように書きます。
1 |
int numFullWidth = chrByteNum - chkStr.Length; |
全て全角文字かどうかはバイト数が文字数の2倍かどうかで判定できます。この判定を変数「isAllFullWidth」に代入するコードをC#では以下のように書きます。
1 |
bool isAllFullWidth = (chrByteNum == chkStr.Length * 2); |
半角を判定する
半角文字に関しては、文字数とバイト数が同じです。よって半角文字数は文字数の2倍からバイト数を引けば出ます。全角文字は2バイトですから文字数の2倍からバイト数を引いても0、半角文字は1バイトですから文字数の2倍からバイト数を引くと文字数になります。
この文字数「numHalfWidth」を計算するコードはC#で以下のように書きます。
1 |
int numHalfWidth = chkStr.Length * 2 - chrByteNum; |
全て半角文字かどうかはバイト数と文字数が等しいかどうかで判定できます。この判定を変数「isAllHalfNum」に代入するコードはC#で以下のように書きます。
1 |
bool isAllHalfNum = (chrByteNum == chkStr.Length); |
全角半角判定のテストコード
以上を踏まえて、C#で全角と半角を判定するプログラムを組みます。用意したテスト用文字列に対して、入力文字列に対して全角のみかどうか・全角文字数・半角のみかどうか・半角文字数をそれぞれ出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
using System; using System.Text; public class StringWidthCheck { static Encoding shiftjisEnc = Encoding.GetEncoding("Shift_JIS"); public static bool isFullWitdh(string chkStr) { int chrByteNum = shiftjisEnc.GetByteCount(chkStr); bool isAllFullWidth = (chrByteNum == chkStr.Length * 2); return isAllFullWidth; } public static int numFullWidth(string chkStr) { int chrByteNum = shiftjisEnc.GetByteCount(chkStr); int numFullWidth = chrByteNum - chkStr.Length; return numFullWidth; } public static bool isHalfWidth(string chkStr) { int chrByteNum = shiftjisEnc.GetByteCount(chkStr); bool isAllHalfNum = (chrByteNum == chkStr.Length); return isAllHalfNum; } public static int numHalfWidth(string chkStr) { int chrByteNum = shiftjisEnc.GetByteCount(chkStr); int numHalfWidth = chkStr.Length * 2 - chrByteNum; return numHalfWidth; } private static void testOutput(string chkStr) { Console.WriteLine("入力文字列:" + chkStr); Console.WriteLine("全角のみか:" + isFullWitdh(chkStr)); Console.WriteLine("全角文字数:" + numFullWidth(chkStr)); Console.WriteLine("半角のみか:" + isHalfWidth(chkStr)); Console.WriteLine("半角文字数:" + numHalfWidth(chkStr)); Console.WriteLine(); } public static void Main() { string chkStr = "あがA阿5"; testOutput(chkStr); chkStr = "アガa5"; testOutput(chkStr); chkStr = "あがA阿5アガa5"; testOutput(chkStr); } } |
テストコードの出力結果
C#での判定テストコードの出力結果は以下の通りです。「あがA阿5」・「アガa5」・「あがA阿5アガa5」についてそれぞれ全角のみかどうか・全角文字数・半角のみかどうか・半角文字数が出力されます。半角文字においては濁点も1文字にカウントされます。
「あがA阿5」は全て全角の5文字、「アガa5」は全て半角の5文字、「あがA阿5アガa5」は全角と半角が5文字ずつ含まれているので以下の通りに出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
入力文字列:あがA阿5 全角のみか:True 全角文字数:5 半角のみか:False 半角文字数:0 入力文字列:アガa5 全角のみか:False 全角文字数:0 半角のみか:True 半角文字数:5 入力文字列:あがA阿5アガa5 全角のみか:False 全角文字数:5 半角のみか:False 半角文字数:5 |
文字列の特性を理解して全角と半角を判定しましょう
C#における全角と半角の判定方法を解説しました。この記事では文字エンコードがShift_JISのケースを取り上げましたが、エンコードが変わっても文字列の特性を利用して判定するということは変わりません。
EUC_JPやUTF8ですと、半角カナもEUC_JPは2バイト、UTF8は3バイトのマルチバイトです。またUTF8を含め、Unicodeでは同じ全角文字でも可変長です。
これらの場合は文字コードによる判定が必要になります。記号文字には等幅フォントであっても半角2文字分の幅でないフォントもありますので、入力を許容する場合は判定の際に考慮します。
文字列の仕様を確実に把握してプログラムの仕様を作ることで、正しく文字列を判定しましょう。