C#で文字列の全角と半角を判定・文字列の文字数とバイト数を利用
- システム
エンジニア - 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#で全角と半角の判定について理解できました。
- プロジェクト
マネージャー - 文字列の仕様を確実に把握してプログラムの仕様を作ることで正しい文字列を判定しましょう。
文字列の特性を理解して全角と半角を判定しましょう
C#における全角と半角の判定方法を解説しました。この記事では文字エンコードがShift_JISのケースを取り上げましたが、エンコードが変わっても文字列の特性を利用して判定するということは変わりません。
EUC_JPやUTF8ですと、半角カナもEUC_JPは2バイト、UTF8は3バイトのマルチバイトです。またUTF8を含め、Unicodeでは同じ全角文字でも可変長です。
これらの場合は文字コードによる判定が必要になります。記号文字には等幅フォントであっても半角2文字分の幅でないフォントもありますので、入力を許容する場合は判定の際に考慮します。
文字列の仕様を確実に把握してプログラムの仕様を作ることで、正しく文字列を判定しましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)