C#のcharとは?文字・文字列の違いから変換・判定・使い方まで初心者向けに解説

はじめに

C#で文字を扱うときによく登場する型がcharです。charは「1文字」を表すための基本的なデータ型で、アルファベット、数字、記号、日本語などの文字を1つだけ格納できます。

一方で、C#には文字列を扱うstringもあります。初心者のうちは、charstringの違いや、シングルクォートとダブルクォートの使い分けで混乱しやすいです。

この記事では、C#のcharについて、文字・文字列の違い、宣言方法、変換、判定、比較、配列、よくあるエラー、実践的な使い方まで初心者向けに解説します。

1. C#のcharとは?1文字を扱うための基本データ型

1-1. charは「1つの文字」を表す型

C#のcharは、1つの文字を扱うためのデータ型です。

たとえば、次のように1文字だけを変数に代入できます。

C#
char letter = 'A';
char number = '1';
char symbol = '!';

charには、原則として1文字だけを代入します。'A''1'のように、文字をシングルクォート'で囲むのが特徴です。

C#
char c = 'a';
Console.WriteLine(c);

実行結果は次のようになります。

C#
a

1-2. charで扱える文字の例

charでは、英字、数字、記号、日本語など、さまざまな文字を扱えます。

C#
char alphabet = 'Z';
char digit = '9';
char mark = '?';
char japanese = 'あ';
char kanji = '漢';

ただし、charはあくまで1文字を表す型です。たとえば'AB'のように2文字以上を入れることはできません。

C#
// エラー
char value = 'AB';

1-3. char型の基本的な書き方

char型の基本的な書き方は次の通りです。

C#
char 変数名 = '文字';

具体例は次のようになります。

C#
char grade = 'A';
char answer = 'Y';
char comma = ',';

あとから値を代入することもできます。

C#
char ch;

ch = 'B';

Console.WriteLine(ch);

charリテラルは必ずシングルクォートで囲みます。ダブルクォートで囲むとstringとして扱われるため、charには代入できません。

C#
// 正しい
char c1 = 'A';

// エラー
char c2 = "A";

1-4. charを使う場面

charは、文字列の中から1文字ずつ取り出して処理したいときによく使います。

たとえば、次のような場面です。

C#
string text = "Hello";

foreach (char c in text)
{
Console.WriteLine(c);
}

実行結果は次のようになります。

C#
H
e
l
l
o

そのほかにも、入力された文字が数字かどうかを判定したり、区切り文字を扱ったり、文字列を1文字ずつ解析したりするときにcharが使われます。

2. charとstringの違い

2-1. charは1文字、stringは文字列

charstringの最も大きな違いは、扱える文字数です。

charは1文字だけを扱います。

C#
char c = 'A';

一方、stringは0文字以上の文字列を扱います。

C#
string s = "A";
string message = "Hello";
string empty = "";

"A"は見た目では1文字ですが、型としてはstringです。'A'char"A"stringという点に注意しましょう。

2-2. シングルクォートとダブルクォートの違い

C#では、charstringで使うクォートが異なります。

C#
char c = 'A';
string s = "A";

charはシングルクォート'で囲みます。

C#
char letter = 'X';

stringはダブルクォート"で囲みます。

C#
string word = "X";

この違いは非常に重要です。初心者がよく間違えるポイントなので、まずは「1文字のcharはシングルクォート、文字列のstringはダブルクォート」と覚えておきましょう。

2-3. charとstringでよくあるコンパイルエラー

次のコードはエラーになります。

C#
char c = "A";

"A"stringなので、char型の変数には代入できません。正しくは次のように書きます。

C#
char c = 'A';

反対に、次のコードもエラーになります。

C#
string s = 'A';

'A'charなので、string型の変数にそのまま代入できません。stringにしたい場合は、ダブルクォートを使います。

C#
string s = "A";

または、ToString()で変換します。

C#
char c = 'A';
string s = c.ToString();

2-4. charとstringを使い分ける基準

1文字だけを扱いたい場合はcharを使います。

C#
char delimiter = ',';
char answer = 'Y';
char firstLetter = 'A';

複数の文字を扱う場合はstringを使います。

C#
string name = "Taro";
string message = "Hello";
string csvLine = "apple,banana,orange";

また、1文字ずつ処理したい場合でも、元のデータ全体はstringとして持ち、処理中にcharとして取り出すことが多いです。

C#
string text = "CSharp";

char first = text[0];

Console.WriteLine(first);

実行結果は次の通りです。

C#
C

3. C#でcharを宣言・代入する方法

3-1. char変数の宣言方法

char変数は次のように宣言します。

C#
char c;

宣言と同時に値を代入する場合は、次のように書きます。

C#
char c = 'A';

あとから値を変更することもできます。

C#
char c = 'A';
c = 'B';

Console.WriteLine(c);

実行結果は次のようになります。

C#
B

3-2. アルファベット・数字・記号をcharに代入する

アルファベットをcharに代入する例です。

C#
char upper = 'A';
char lower = 'z';

数字もcharに代入できます。

C#
char digit = '5';

ただし、'5'は文字としての5であり、数値の5とは異なります。

C#
char c = '5';
int n = 5;

記号もcharとして扱えます。

C#
char comma = ',';
char period = '.';
char plus = '+';
char space = ' ';

空白1文字もcharです。

C#
char blank = ' ';

3-3. 日本語などの全角文字をcharに代入する

C#のcharには、日本語のひらがな、カタカナ、漢字なども代入できます。

C#
char hiragana = 'あ';
char katakana = 'ア';
char kanji = '日';

次のように出力できます。

C#
char c = '語';

Console.WriteLine(c);

実行結果は次のようになります。

C#

ただし、絵文字や一部の特殊な文字は、見た目では1文字でもchar1つでは表せない場合があります。この点は後ほどサロゲートペアの項目で解説します。

3-4. エスケープ文字をcharで扱う方法

改行やタブ、シングルクォートなど、通常の文字として書きにくいものはエスケープ文字で表します。

C#
char newLine = '\n';
char tab = '\t';
char singleQuote = '\'';
char backslash = '\\';

たとえば、改行文字を使うと次のようになります。

C#
Console.Write('A');
Console.Write('\n');
Console.Write('B');

実行結果は次のようになります。

C#
A
B

Unicodeエスケープを使って文字を指定することもできます。

C#
char c = '\u3042';

Console.WriteLine(c);

\u3042は「あ」を表すため、実行結果は次のようになります。

C#

3-5. charの初期値とdefault値

charの既定値は'\0'です。これはヌル文字と呼ばれる文字で、文字列のnullとは別物です。

C#
char c = default;

Console.WriteLine((int)c);

実行結果は次のようになります。

C#
0

default(char)と書いても同じです。

C#
char c = default(char);

'\0'は「何もない文字列」ではなく、文字コードが0の1文字です。

C#
char c = '\0';

4. charと文字コードの関係

4-1. C#のcharはUnicode文字を表す

C#のcharは、内部的には16ビットの値で表されます。より正確には、UTF-16のコード単位を表す型です。

そのため、charは多くの一般的な文字を1つで表せます。

C#
char a = 'A';
char japanese = 'あ';
char kanji = '漢';

ただし、すべてのUnicode文字をchar1つで表せるわけではありません。たとえば絵文字のような一部の文字は、char2つを組み合わせて表すことがあります。

4-2. charをintに変換して文字コードを確認する

charintにキャストすると、その文字に対応するコード値を確認できます。

C#
char c = 'A';
int code = (int)c;

Console.WriteLine(code);

実行結果は次のようになります。

C#
65

'A'のコード値は65です。

日本語の文字でも確認できます。

C#
char c = 'あ';
int code = (int)c;

Console.WriteLine(code);

このように、charは文字として扱うだけでなく、数値的なコード値として確認することもできます。

4-3. intからcharへ変換する方法

intからcharへ変換するには、キャストを使います。

C#
int code = 65;
char c = (char)code;

Console.WriteLine(c);

実行結果は次のようになります。

C#
A

数字のコード値から文字を作るときに便利です。

C#
for (int i = 65; i <= 70; i++)
{
Console.WriteLine((char)i);
}

実行結果は次のようになります。

C#
A
B
C
D
E
F

ただし、すべてのint値が有効な文字として意味を持つわけではありません。変換する値の範囲や意味には注意が必要です。

4-4. サロゲートペアと絵文字を扱うときの注意点

絵文字などの一部の文字は、char1つでは表せません。UTF-16では、2つのcharを組み合わせて1つの文字を表す場合があります。これをサロゲートペアと呼びます。

たとえば、次のような絵文字を考えます。

C#
string emoji = "😀";

Console.WriteLine(emoji.Length);

実行結果は、多くの場合次のようになります。

C#
2

見た目では1文字ですが、string.Lengthでは2になります。これは、charが2つ使われているためです。

C#
string emoji = "😀";

Console.WriteLine((int)emoji[0]);
Console.WriteLine((int)emoji[1]);

絵文字や特殊なUnicode文字を正確に1文字単位で扱いたい場合、単純にcharで処理すると期待通りにならないことがあります。

.NETでは、Unicodeのスカラー値を扱うためにSystem.Text.Runeを使う選択肢もあります。初心者の段階では、まず「charは見た目上の1文字と常に一致するとは限らない」と覚えておくとよいでしょう。

5. charとstringを相互に変換する方法

5-1. charをstringに変換する

charstringに変換するには、ToString()を使います。

C#
char c = 'A';
string s = c.ToString();

Console.WriteLine(s);

実行結果は次のようになります。

C#
A

文字列結合でもcharは自動的に文字列として扱われます。

C#
char c = 'A';
string message = "文字は " + c + " です";

Console.WriteLine(message);

実行結果は次のようになります。

C#
文字は A です

5-2. stringからcharを取り出す

stringから特定の位置の文字を取り出すには、インデックスを指定します。

C#
string text = "Hello";

char first = text[0];
char second = text[1];

Console.WriteLine(first);
Console.WriteLine(second);

実行結果は次のようになります。

C#
H
e

C#のインデックスは0から始まります。そのため、最初の文字はtext[0]です。

最後の文字を取り出すには、次のように書けます。

C#
string text = "Hello";

char last = text[text.Length - 1];

Console.WriteLine(last);

実行結果は次のようになります。

C#
o

5-3. stringが1文字か確認してcharに変換する

stringcharに変換したい場合、文字列の長さが1であることを確認すると安全です。

C#
string text = "A";

if (text.Length == 1)
{
char c = text[0];
Console.WriteLine(c);
}

char.Parse()を使う方法もあります。

C#
string text = "A";
char c = char.Parse(text);

Console.WriteLine(c);

ただし、char.Parse()は文字列が1文字でない場合に例外が発生します。

C#
string text = "AB";

// 例外が発生する
char c = char.Parse(text);

安全に変換したい場合は、char.TryParse()を使います。

C#
string text = "A";

if (char.TryParse(text, out char c))
{
Console.WriteLine(c);
}
else
{
Console.WriteLine("charに変換できません");
}

5-4. char配列とstringを変換する

stringchar配列に変換するには、ToCharArray()を使います。

C#
string text = "Hello";
char[] chars = text.ToCharArray();

foreach (char c in chars)
{
Console.WriteLine(c);
}

char配列からstringを作成するには、new string()を使います。

C#
char[] chars = { 'H', 'e', 'l', 'l', 'o' };
string text = new string(chars);

Console.WriteLine(text);

実行結果は次のようになります。

C#
Hello

5-5. ToString・ToCharArray・インデックス指定の使い分け

charstringにしたい場合はToString()を使います。

C#
char c = 'A';
string s = c.ToString();

stringから特定の1文字を取り出したい場合はインデックスを使います。

C#
string text = "ABC";
char c = text[0];

string全体を1文字ずつ配列として扱いたい場合はToCharArray()を使います。

C#
string text = "ABC";
char[] chars = text.ToCharArray();

単純に1文字ずつ読みたいだけなら、ToCharArray()を使わずにforeachで処理できます。

C#
string text = "ABC";

foreach (char c in text)
{
Console.WriteLine(c);
}

6. charを判定する方法

6-1. 文字が数字か判定する

文字が数字かどうかを判定するには、char.IsDigit()を使います。

C#
char c = '5';

if (char.IsDigit(c))
{
Console.WriteLine("数字です");
}

実行結果は次のようになります。

C#
数字です

'5'は数字の文字なのでtrueになります。

C#
Console.WriteLine(char.IsDigit('5'));
Console.WriteLine(char.IsDigit('A'));

実行結果は次のようになります。

C#
True
False

6-2. 文字が英字か判定する

文字が文字かどうかを判定するには、char.IsLetter()を使います。

C#
char c = 'A';

if (char.IsLetter(c))
{
Console.WriteLine("文字です");
}

char.IsLetter()は英字だけでなく、日本語などの文字にも反応します。

C#
Console.WriteLine(char.IsLetter('A'));
Console.WriteLine(char.IsLetter('あ'));
Console.WriteLine(char.IsLetter('1'));

実行結果は次のようになります。

C#
True
True
False

英字だけを判定したい場合は、範囲比較を使うこともあります。

C#
char c = 'A';

bool isAlphabet =
('A' <= c && c <= 'Z') ||
('a' <= c && c <= 'z');

Console.WriteLine(isAlphabet);

6-3. 文字が英数字か判定する

英数字かどうかを判定するには、char.IsLetterOrDigit()を使います。

C#
char c = '7';

if (char.IsLetterOrDigit(c))
{
Console.WriteLine("英数字または文字です");
}

例を見てみましょう。

C#
Console.WriteLine(char.IsLetterOrDigit('A'));
Console.WriteLine(char.IsLetterOrDigit('9'));
Console.WriteLine(char.IsLetterOrDigit('-'));

実行結果は次のようになります。

C#
True
True
False

ユーザーIDやパスワードのチェックなどでよく使われます。

6-4. 文字が大文字・小文字か判定する

大文字かどうかを判定するには、char.IsUpper()を使います。

C#
Console.WriteLine(char.IsUpper('A'));
Console.WriteLine(char.IsUpper('a'));

実行結果は次のようになります。

C#
True
False

小文字かどうかを判定するには、char.IsLower()を使います。

C#
Console.WriteLine(char.IsLower('A'));
Console.WriteLine(char.IsLower('a'));

実行結果は次のようになります。

C#
False
True

6-5. 空白文字か判定する

空白文字かどうかを判定するには、char.IsWhiteSpace()を使います。

C#
Console.WriteLine(char.IsWhiteSpace(' '));
Console.WriteLine(char.IsWhiteSpace('\n'));
Console.WriteLine(char.IsWhiteSpace('\t'));
Console.WriteLine(char.IsWhiteSpace('A'));

実行結果は次のようになります。

C#
True
True
True
False

半角スペースだけでなく、改行やタブも空白文字として判定されます。

6-6. 記号や区切り文字を判定する

記号かどうかを判定するには、char.IsSymbol()char.IsPunctuation()を使います。

C#
Console.WriteLine(char.IsPunctuation(','));
Console.WriteLine(char.IsPunctuation('.'));
Console.WriteLine(char.IsPunctuation('A'));

実行結果は次のようになります。

C#
True
True
False

区切り文字を判定したい場合は、単純に比較することも多いです。

C#
char c = ',';

if (c == ',')
{
Console.WriteLine("カンマです");
}

複数の区切り文字を判定したい場合は、Contains()を使うと便利です。

C#
char c = ';';
string delimiters = ",;:";

if (delimiters.Contains(c))
{
Console.WriteLine("区切り文字です");
}

6-7. char.IsDigit・IsLetter・IsWhiteSpaceなどの使い方

charには、文字の種類を判定するための便利なメソッドが多く用意されています。

C#
char c = 'A';

Console.WriteLine(char.IsDigit(c)); // 数字か
Console.WriteLine(char.IsLetter(c)); // 文字か
Console.WriteLine(char.IsLetterOrDigit(c));// 文字または数字か
Console.WriteLine(char.IsUpper(c)); // 大文字か
Console.WriteLine(char.IsLower(c)); // 小文字か
Console.WriteLine(char.IsWhiteSpace(c)); // 空白文字か
Console.WriteLine(char.IsPunctuation(c)); // 句読点か
Console.WriteLine(char.IsSymbol(c)); // 記号か

ユーザー入力の検証や文字列解析では、これらのメソッドを使うと読みやすく安全なコードになります。

7. charを変換する方法

7-1. 大文字と小文字を変換する

charを大文字に変換するには、char.ToUpper()を使います。

C#
char c = 'a';
char upper = char.ToUpper(c);

Console.WriteLine(upper);

実行結果は次のようになります。

C#
A

小文字に変換するには、char.ToLower()を使います。

C#
char c = 'A';
char lower = char.ToLower(c);

Console.WriteLine(lower);

実行結果は次のようになります。

C#
a

英字の比較で大文字・小文字を区別したくない場合に便利です。

C#
char input = 'y';

if (char.ToUpper(input) == 'Y')
{
Console.WriteLine("Yesが選択されました");
}

7-2. 数字のcharをintに変換する

数字のcharを数値のintに変換するときは注意が必要です。

次のようにキャストすると、数値の5ではなく文字コードが取得されます。

C#
char c = '5';
int code = (int)c;

Console.WriteLine(code);

実行結果は次のようになります。

C#
53

'5'を数値の5にしたい場合は、次のように'0'を引きます。

C#
char c = '5';
int number = c - '0';

Console.WriteLine(number);

実行結果は次のようになります。

C#
5

ただし、この方法はcが数字であることを前提にしています。安全に処理するなら、事前にchar.IsDigit()で確認しましょう。

C#
char c = '5';

if (char.IsDigit(c))
{
int number = c - '0';
Console.WriteLine(number);
}

7-3. intを数字のcharに変換する

0から9までの数値を数字のcharに変換するには、'0'を足します。

C#
int number = 5;
char c = (char)('0' + number);

Console.WriteLine(c);

実行結果は次のようになります。

C#
5

ただし、この方法は0から9までの1桁の数字に使います。

C#
int number = 12;

// これは「12」という文字にはならない
char c = (char)('0' + number);

複数桁の数値を文字列にしたい場合は、ToString()を使います。

C#
int number = 12;
string text = number.ToString();

Console.WriteLine(text);

7-4. charをASCIIコードとして扱う方法

英数字や一部の記号は、ASCIIコードとして扱うこともできます。

C#
char c = 'A';
int ascii = (int)c;

Console.WriteLine(ascii);

実行結果は次のようになります。

C#
65

小文字の'a'は97です。

C#
Console.WriteLine((int)'a');

文字コードの範囲を使って英字判定をすることもできます。

C#
char c = 'G';

if ('A' <= c && c <= 'Z')
{
Console.WriteLine("大文字の英字です");
}

ただし、C#のcharはASCII専用ではありません。日本語やUnicode文字も扱えるため、「char = ASCII」と考えないようにしましょう。

7-5. Parse・Convert・キャストの違い

char.Parse()は、1文字のstringcharに変換します。

C#
char c = char.Parse("A");

文字列が2文字以上、または空文字の場合は例外が発生します。

C#
// 例外
char c1 = char.Parse("AB");

// 例外
char c2 = char.Parse("");

Convert.ToChar()も変換に使えます。

C#
char c = Convert.ToChar("A");

intからcharに変換する場合はキャストを使います。

C#
int code = 65;
char c = (char)code;

使い分けの目安は次の通りです。

C#
// stringが1文字であることを前提にcharへ変換
char c1 = char.Parse("A");

// 変換できるか確認しながら安全に変換
bool ok = char.TryParse("A", out char c2);

// 文字コードからcharへ変換
char c3 = (char)65;

8. charを比較・検索する方法

8-1. char同士を比較する

char同士は、==!=で比較できます。

C#
char a = 'A';
char b = 'A';
char c = 'B';

Console.WriteLine(a == b);
Console.WriteLine(a == c);

実行結果は次のようになります。

C#
True
False

大文字と小文字は別の文字として扱われます。

C#
Console.WriteLine('A' == 'a');

実行結果は次のようになります。

C#
False

大文字・小文字を区別せずに比較したい場合は、変換してから比較します。

C#
char x = 'A';
char y = 'a';

bool same = char.ToUpper(x) == char.ToUpper(y);

Console.WriteLine(same);

実行結果は次のようになります。

C#
True

8-2. string内の特定文字を検索する

文字列の中に特定のcharが含まれているかを調べるには、Contains()IndexOf()を使います。

C#
string text = "Hello";
char target = 'e';

Console.WriteLine(text.Contains(target));

実行結果は次のようになります。

C#
True

Contains()は含まれているかどうかをtrueまたはfalseで返します。

8-3. IndexOfで文字の位置を取得する

IndexOf()を使うと、文字が最初に出現する位置を取得できます。

C#
string text = "Hello";
int index = text.IndexOf('l');

Console.WriteLine(index);

実行結果は次のようになります。

C#
2

インデックスは0から始まるため、"Hello"の最初の'l'は2番目の位置です。

文字が見つからない場合は-1が返ります。

C#
string text = "Hello";

Console.WriteLine(text.IndexOf('z'));

実行結果は次のようになります。

C#
-1

8-4. Containsで文字が含まれるか確認する

文字が含まれているかだけを知りたい場合は、Contains()が分かりやすいです。

C#
string text = "apple";

if (text.Contains('a'))
{
Console.WriteLine("aが含まれています");
}

区切り文字の判定にも使えます。

C#
char c = ',';
string delimiters = ",;|";

if (delimiters.Contains(c))
{
Console.WriteLine("区切り文字です");
}

8-5. foreachで文字列を1文字ずつ処理する

文字列を1文字ずつ処理するには、foreachを使います。

C#
string text = "ABC";

foreach (char c in text)
{
Console.WriteLine(c);
}

実行結果は次のようになります。

C#
A
B
C

たとえば、文字列の中に数字がいくつ含まれているかを数えることもできます。

C#
string text = "A1B2C3";
int count = 0;

foreach (char c in text)
{
if (char.IsDigit(c))
{
count++;
}
}

Console.WriteLine(count);

実行結果は次のようになります。

C#
3

9. char配列の使い方

9-1. char配列を宣言する

char配列は、複数の文字を配列として扱いたい場合に使います。

C#
char[] chars = { 'A', 'B', 'C' };

要素を取り出すには、インデックスを指定します。

C#
Console.WriteLine(chars[0]);
Console.WriteLine(chars[1]);
Console.WriteLine(chars[2]);

実行結果は次のようになります。

C#
A
B
C

あとから値を変更することもできます。

C#
char[] chars = { 'A', 'B', 'C' };

chars[1] = 'X';

Console.WriteLine(chars[1]);

実行結果は次のようになります。

C#
X

9-2. stringをchar配列に変換する

stringchar配列に変換するには、ToCharArray()を使います。

C#
string text = "Hello";
char[] chars = text.ToCharArray();

配列に変換すると、文字を並べ替えたり、一部を変更したりしやすくなります。

C#
string text = "cat";
char[] chars = text.ToCharArray();

chars[0] = 'b';

string result = new string(chars);

Console.WriteLine(result);

実行結果は次のようになります。

C#
bat

9-3. char配列からstringを作成する

char配列からstringを作るには、new string(char[])を使います。

C#
char[] chars = { 'C', '#', '!' };
string text = new string(chars);

Console.WriteLine(text);

実行結果は次のようになります。

C#
C#!

文字列を加工してから再び文字列に戻したい場合によく使われます。

9-4. 文字列を逆順にする実装例

char配列を使うと、文字列を逆順にする処理も実装できます。

C#
string text = "Hello";
char[] chars = text.ToCharArray();

Array.Reverse(chars);

string reversed = new string(chars);

Console.WriteLine(reversed);

実行結果は次のようになります。

C#
olleH

ただし、絵文字やサロゲートペアを含む文字列では、単純なchar単位の反転では文字が壊れる可能性があります。通常の英数字や一般的な日本語であれば、この方法で扱いやすいです。

9-5. 文字列加工でchar配列を使うケース

stringは変更できない性質を持つため、文字列の一部を直接書き換えることはできません。

C#
string text = "cat";

// エラー
// text[0] = 'b';

このような場合は、一度char配列に変換してから加工します。

C#
string text = "cat";
char[] chars = text.ToCharArray();

chars[0] = 'b';

string result = new string(chars);

Console.WriteLine(result);

実行結果は次のようになります。

C#
bat

文字列を1文字ずつ変更したい場合や、特定の位置の文字を置き換えたい場合にchar配列が役立ちます。

10. charでよくあるエラーと注意点

10-1. charに2文字以上を代入できない

charには1文字しか代入できません。

C#
// エラー
char c = 'AB';

2文字以上を扱いたい場合は、stringを使います。

C#
string s = "AB";

見た目では短くても、2文字以上であればcharではなくstringです。

10-2. charに空文字を代入できない

charには空文字を代入できません。

C#
// エラー
char c = '';

空の文字列を表したい場合は、stringを使います。

C#
string s = "";

charの既定値として'\0'はありますが、これは空文字ではありません。文字コード0の1文字です。

C#
char c = '\0';

10-3. charとstringを混同したエラー

次のように、charstringを混同するとエラーになります。

C#
// エラー
char c = "A";

// エラー
string s = 'A';

正しくは次のように書きます。

C#
char c = 'A';
string s = "A";

charstringに変換したい場合は、ToString()を使います。

C#
char c = 'A';
string s = c.ToString();

stringからcharを取り出したい場合は、インデックスを指定します。

C#
string s = "A";
char c = s[0];

10-4. 数字のcharと数値のintを混同する

'1'1は別物です。

C#
char c = '1';
int n = 1;

'1'は文字、1は数値です。charintにキャストすると、数値そのものではなく文字コードになります。

C#
char c = '1';
int code = (int)c;

Console.WriteLine(code);

実行結果は次のようになります。

C#
49

数字の文字を数値にしたい場合は、'0'を引きます。

C#
char c = '1';
int number = c - '0';

Console.WriteLine(number);

実行結果は次のようになります。

C#
1

10-5. 日本語・絵文字・特殊文字を扱う際の注意点

日本語の多くの文字はchar1つで扱えます。

C#
char c = 'あ';

しかし、絵文字や一部の特殊文字はchar1つでは扱えないことがあります。

C#
string emoji = "😀";

Console.WriteLine(emoji.Length);

見た目では1文字でも、Lengthが2になる場合があります。

そのため、文字列をchar単位で分割・削除・反転すると、絵文字が壊れることがあります。

C#
string emoji = "😀";
char first = emoji[0];

Console.WriteLine(first);

このような処理では、表示上の1文字とcharの1要素が一致しないことを意識しましょう。

11. charの実践的な使い方

11-1. 入力文字が数字かチェックする

ユーザーが入力した文字列の先頭1文字が数字かどうかを確認する例です。

C#
Console.Write("1文字入力してください: ");
string input = Console.ReadLine();

if (!string.IsNullOrEmpty(input))
{
char c = input[0];

if (char.IsDigit(c))
{
Console.WriteLine("数字です");
}
else
{
Console.WriteLine("数字ではありません");
}
}

char.IsDigit()を使うことで、手軽に数字判定ができます。

入力が1文字かどうかも確認したい場合は、次のようにします。

C#
string input = Console.ReadLine();

if (input.Length == 1 && char.IsDigit(input[0]))
{
Console.WriteLine("1文字の数字です");
}
else
{
Console.WriteLine("条件に一致しません");
}

11-2. パスワードに英数字が含まれるか判定する

パスワードに英字と数字が含まれているかを判定する例です。

C#
string password = "abc123";

bool hasLetter = false;
bool hasDigit = false;

foreach (char c in password)
{
if (char.IsLetter(c))
{
hasLetter = true;
}

if (char.IsDigit(c))
{
hasDigit = true;
}
}

if (hasLetter && hasDigit)
{
Console.WriteLine("英字と数字が含まれています");
}
else
{
Console.WriteLine("英字と数字の両方が必要です");
}

charを使って1文字ずつ確認することで、入力チェックを実装できます。

大文字を含むか、小文字を含むかを確認したい場合は、次のようにできます。

C#
string password = "Abc123";

bool hasUpper = false;
bool hasLower = false;

foreach (char c in password)
{
if (char.IsUpper(c))
{
hasUpper = true;
}

if (char.IsLower(c))
{
hasLower = true;
}
}

Console.WriteLine(hasUpper);
Console.WriteLine(hasLower);

11-3. 文字列から特定の文字を削除する

文字列から特定の文字を削除するには、foreachで必要な文字だけを集める方法があります。

C#
string text = "a-b-c-d";
char removeChar = '-';

string result = "";

foreach (char c in text)
{
if (c != removeChar)
{
result += c;
}
}

Console.WriteLine(result);

実行結果は次のようになります。

C#
abcd

ただし、文字列を大量に連結する場合はStringBuilderを使った方が効率的です。

C#
using System.Text;

string text = "a-b-c-d";
char removeChar = '-';

StringBuilder sb = new StringBuilder();

foreach (char c in text)
{
if (c != removeChar)
{
sb.Append(c);
}
}

string result = sb.ToString();

Console.WriteLine(result);

また、単純な文字の削除ならReplace()を使うこともできます。

C#
string text = "a-b-c-d";
string result = text.Replace("-", "");

Console.WriteLine(result);

11-4. CSVや区切り文字を処理する

カンマ区切りの文字列を処理するとき、区切り文字としてcharを使うことがあります。

C#
string line = "apple,banana,orange";
char delimiter = ',';

string[] items = line.Split(delimiter);

foreach (string item in items)
{
Console.WriteLine(item);
}

実行結果は次のようになります。

C#
apple
banana
orange

Split()では、区切り文字としてcharを指定できます。

複数の区切り文字を使う場合は、char配列を渡します。

C#
string text = "apple,banana;orange|grape";
char[] delimiters = { ',', ';', '|' };

string[] items = text.Split(delimiters);

foreach (string item in items)
{
Console.WriteLine(item);
}

11-5. 文字列を1文字ずつ解析する

charは、文字列を1文字ずつ解析する処理に向いています。

たとえば、文字列の中に含まれる数字だけを取り出す例です。

C#
string text = "abc123def45";
string numbers = "";

foreach (char c in text)
{
if (char.IsDigit(c))
{
numbers += c;
}
}

Console.WriteLine(numbers);

実行結果は次のようになります。

C#
12345

英字だけを取り出すこともできます。

C#
string text = "abc123DEF!";
string letters = "";

foreach (char c in text)
{
if (char.IsLetter(c))
{
letters += c;
}
}

Console.WriteLine(letters);

実行結果は次のようになります。

C#
abcDEF

このように、charを使うと文字列の内容を細かく調べながら処理できます。

12. charに関するよくある質問

12-1. C#のcharは何バイト?

C#のcharは16ビット、つまり2バイトの値です。

ただし、これは「すべての見た目上の文字が2バイトで表せる」という意味ではありません。C#のcharはUTF-16のコード単位であり、絵文字など一部の文字は2つのcharを使って表されることがあります。

C#
char c = 'A';

Console.WriteLine(sizeof(char));

安全な文脈であれば、sizeof(char)は2を返します。

12-2. charにnullは入れられる?

通常のcharにはnullを代入できません。

C#
// エラー
char c = null;

nullを扱いたい場合は、nullableなchar?を使います。

C#
char? c = null;

if (c == null)
{
Console.WriteLine("値がありません");
}

char?には通常の文字も代入できます。

C#
char? c = 'A';

'\0'nullは異なります。'\0'は文字コード0の文字であり、nullは値が存在しないことを表します。

12-3. charとbyteの違いは?

charは文字を扱うための型です。

C#
char c = 'A';

byteは0から255までの数値を扱うための型です。

C#
byte b = 65;

charbyteに変換できる場合もありますが、すべての文字が1バイトに収まるわけではありません。

C#
char c = 'A';
byte b = (byte)c;

Console.WriteLine(b);

英字のAは65なので変換できますが、日本語のような文字は1バイトでは表せません。

C#
char c = 'あ';

// 値が大きいため、単純なbyte変換には注意が必要

文字コードやエンコーディングを扱う場合は、Encoding.UTF8.GetBytes()などを使って、文字列をバイト配列に変換します。

C#
using System.Text;

string text = "あ";
byte[] bytes = Encoding.UTF8.GetBytes(text);

Console.WriteLine(bytes.Length);

12-4. charとStringBuilderはどう使い分ける?

charは1文字を表す型です。

C#
char c = 'A';

StringBuilderは、文字列を効率よく組み立てるためのクラスです。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

sb.Append('A');
sb.Append('B');
sb.Append('C');

Console.WriteLine(sb.ToString());

実行結果は次のようになります。

C#
ABC

1文字を扱うならchar、文字列を何度も追加・変更するならStringBuilderを使うとよいです。

次のようにループで文字列を作る場合は、StringBuilderが向いています。

C#
using System.Text;

string text = "A1B2C3";
StringBuilder sb = new StringBuilder();

foreach (char c in text)
{
if (char.IsLetter(c))
{
sb.Append(c);
}
}

Console.WriteLine(sb.ToString());

実行結果は次のようになります。

C#
ABC

12-5. charで絵文字を正しく扱える?

絵文字はchar1つで正しく扱えない場合があります。

C#
string emoji = "😀";

Console.WriteLine(emoji.Length);

見た目では1文字でも、Lengthが2になることがあります。これは、絵文字がサロゲートペアとして2つのcharで表されるためです。

C#
string emoji = "😀";

foreach (char c in emoji)
{
Console.WriteLine((int)c);
}

このように、foreachで回すと2つのcharとして処理される場合があります。

絵文字や複雑なUnicode文字を「見た目上の1文字」として正しく扱いたい場合は、charだけで処理しようとせず、System.Text.Runeやテキスト要素を考慮した方法を検討する必要があります。

初心者の段階では、英数字や一般的な日本語はcharで扱いやすい一方、絵文字は特別な注意が必要と理解しておくとよいです。

まとめ

C#のcharは、1文字を扱うための基本データ型です。'A''1''あ'のように、文字をシングルクォートで囲んで表します。

charstringの違いは特に重要です。charは1文字、stringは文字列を表します。'A'char"A"stringです。見た目が似ていても型が異なるため、代入や変換でエラーにならないよう注意しましょう。

また、char.IsDigit()char.IsLetter()char.IsWhiteSpace()などを使うと、文字の種類を簡単に判定できます。大文字・小文字の変換にはchar.ToUpper()char.ToLower()を使います。

文字列から1文字を取り出す場合はインデックス指定、文字列全体を1文字ずつ処理する場合はforeach、文字列を配列として加工する場合はToCharArray()が便利です。

ただし、C#のcharはUTF-16のコード単位であり、絵文字などの一部の文字はchar1つで表せない場合があります。日本語や特殊文字を扱うときは、見た目上の1文字とcharの1要素が必ず一致するとは限らない点に注意しましょう。

charを正しく理解すると、文字列処理、入力チェック、変換、検索、解析などのコードが書きやすくなります。C#で文字を扱う基礎として、まずはcharstringの違い、宣言方法、判定メソッド、変換方法をしっかり押さえておきましょう。