Javaのcharとは?Stringとの関係性やcharの使い方を解説
Javaのcharは16ビット(2バイト)のプリミティブ型で、Unicodeという文字コード規格での一文字を、0~65,535の範囲の数字で表したものです。プログラムやコンピュータでは、文字も数字で表しますので、charがJavaで文字を扱う時の最小単位です。
charは数字でもあり文字でもあります。ですので、プログラム上でcharを表現できる書き方はいろいろあって、文字そのもの、2進数、10進数、16進数、Unicodeのコードポイントなどが使えます。
Javaの文字列であるStringは、charが集まってできたものとも言えるので、charとStringは大変関連の深い間柄です。ですので、charを理解することはStringを理解することにもつながり、ゆくゆくはUnicodeの理解にもつながっていく大事なことなのです。
この記事では、Javaのcharについて、そもそもcharとはどういうものかという基礎から、じっくりとお伝えします。もちろん、Stringとの相互変換の仕方など、便利な知識も盛りだくさんです。
※この記事のサンプルは、Java 11の環境で動作確認しています
1.charはUnicodeの一文字を表す0~65535の数字
Javaのcharは16ビット(2バイト)のプリミティブ型(primitive、基本データ型)で、Unicode(ユニコード)という文字コード規格での一文字を、0~65535の範囲の整数で表すものです。
charはプリミティブ型ですので「数字そのもの」です。ですから、何かのクラスのインスタンスではありません。クラスとしてcharを表現する場合は、JavaではCharacterというクラスを使います。
charと他のプリミティブ型を比較すると、以下のようになります。
データ型 | 値の種類 | ビット数 | 表現できる値の範囲 | 接尾語 | 備考 |
boolean | 真偽値 | 1ビット | true/falseのどちらか | – | |
byte | 整数 | 8ビット(1バイト) | -128~127 | – | |
short | 整数 | 16ビット(2バイト) | -32,768~32,767 | – | |
char | 文字 | 16ビット(2バイト) | 0~65,535 | – | Unicode文字、\u0000~\uffff |
int | 整数 | 32ビット(4バイト) | -2,147,483,648~ 2,147,483,647 | – | 約±21億4千7百万、Unicodeコードポイント |
long | 整数 | 64ビット(8バイト) | -9,223,372,036,854,775,808~ 9,223,372,036,854,775,807 | Lまたはl | 約±922京 |
float | 浮動小数点 | 32ビット(4バイト) | ±3.40282347E+38~ 1.40239846E-45 | Fまたはf | 単精度 約±3.4×10の38乗~約±1.4×10の-45乗 |
double | 浮動小数点 | 64ビット(8バイト) | ±1.79769313486231570E+308~±4.94065645841246544E-324 | Dまたはd | 倍精度 |
1-1.プログラムでは文字も数字で表現する
Javaに限らずプログラムやコンピュータは、内部ではすべてを数字で表現します。文字や文字列もすべて数字です。例えば、‘A’という文字には、Unicodeでは65という数字が割り当てられています。‘あ‘は12354です。
文字と数字の紐付け方には、たくさんのルールがあります。Javaではその一つであるUnicodeが最初から採用されていて、その中のUTF-16というルールが使われています。このUTF-16の“16”は、16ビットが処理単位だよということで、だからcharは16ビットなのです。
同じようなルールには、日本語環境ではいわゆるシフトJISやEUC-JP、JISなどがあります。Unicodeの中でも、UTF-8やUTF-32というものもあります。Javaでもこれらのルールはもちろん扱えますが、Javaのプログラム中で文字・文字列を扱う時は、UnicodeおよびUTF-16を前提にするのが普通です。
1-2.charとStringは遠くて近いモノ
charと、Javaで文字列を表すクラスのStringは、お互いに違ったモノ同士です。charは一文字を表す数字なのに対して、JavaのStringは0文字以上の文字が集まったモノで、Stringクラスのインスタンスです。
String s = "ABC"; // ABCという文字列を、 char[] c = s.toCharArray(); // 一文字ずつの文字の配列に変換できる System.out.println(s); // → ABC System.out.println(c[0]); // → 1番目の文字はA、 System.out.println(c[1]); // → 2番目の文字はB、 System.out.println(c[2]); // → 3番目の文字はC
char[] c = { 'あ', 'い', 'う', 'え', 'お' }; // あ い う え おの文字の配列を、 String s = new String(c); // 文字列に変換すれば、 System.out.println(s); // → 文字列の"あいうえお"になる
charとStringはプログラム上で違うモノなので、お互いに代入は出来ませんし、値を直接比べられもしません。そういうことをするなら、charかStringのどちらかに寄せる必要があります。そのやり方は後述します。
char c = 'A'; // → OK、charに文字を代入する String s = "A"; // → OK、Stringに文字列を代入する char c2 = "A"; // → NG(コンパイルエラー)、charに文字列を代入しようとしている String s2 = 'A'; // → NG(コンパイルエラー)、Stringに文字を代入しようとしている // char(文字)とString(文字列)は比較もできない // ↓違うもの同士を比較しているので、コンパイルエラー if ('A' == "A") { System.out.println("'A' == \"A\"です"); } // ↓これはコンパイルエラーにはならないが、同じモノとは判断されない if ("A".equals('A')) { System.out.println("\"A\".equals('A')です"); }
なお、ぜひ知っておいていただきたいのは、Stringはcharが集まってできているモノで、Stringは配列のようなインデックスでcharにアクセスできるということです。そんなStringの詳細については、以下の記事も参考にしてください。
関連記事2.charの使い方
この章ではcharの使い方を解説します。charを使う上では、どうしてもいわゆる「文字コード」の知識があることが前提になってくるので、最小限の文字コードの知識についてもお伝えしていきます。
2-1.charの宣言と代入
charは整数を表すデータ型の一つです。変数の宣言の仕方、代入の仕方などは、配列の場合も含めてJavaの他のプリミティブと同じやり方で行えます。
// charを変数として扱う場合のサンプル char c1; // char型の変数の宣言(データ型 変数名) c1 = 65; // 変数cに65(文字のA)を代入した char c2 = 66; // 変数の宣言と初期値(66→B)の代入を同時に行う System.out.println(c1); // → A System.out.println(c2); // → B
charの配列は文字の集まりです。ですが、charの配列はStringそのものではありません。charの配列は、charをひとまとめにして取り扱うためのもので、インデックスで素早くアクセスしたい場合に一時的に使うもの、くらいの感覚でいてください。
// charを配列として扱う場合のサンプル char[] charArray1; // 配列型の変数を宣言して、 charArray1 = new char[3]; // 配列の実体をnewして紐付けて、 charArray1[0] = 65; // インデックスへ数字を代入する charArray1[1] = 66; charArray1[2] = 67; char[] charArray2 = {97, 98, 99}; // 宣言と初期化を同時に行う System.out.println(java.util.Arrays.toString(charArray1)); // → [A, B, C] System.out.println(java.util.Arrays.toString(charArray2)); // → [a, b, c]
charをフィールドや配列で使った時は、初期値は0になります。これは他の数字型プリミティブと同じ動きです。
class CharTest { char c; // charをフィールドとして宣言したが、初期値は未設定 public static void main(String[] args) { CharTest charTest = new CharTest(); System.out.println(charTest.c); // → 0、変数宣言時に初期化されていないので、デフォルト値0が設定される char[] array = new char[5]; System.out.println(array[0]); // → 0、newした時点で配列全体が0で初期化される } }
2-1-1.charへは0~65535以外は代入できない
charは0~65535までの整数なので、小数点以下がある数字、マイナスの数字、65536以上の数字を直接代入できません。
// いずれもコンパイルエラー!! char c1 = 3.14; // → "doubleからcharには変換できません" char c2 = -1; // → "intからcharには変換できません" char c3 = 65536; // → 同上
ただし、それらをcharにキャストしたなら話は別です。仕組み的には、intにキャストされた後、あらためてcharにキャストされます。
// これらの数字をcharにキャストすることはできる char c1 = (char)3.14; // → 3 char c2 = (char)-1; // → 65535 char c3 = (char)65536; // → 0
charはキャストしないで使うのが普通なので、キャストの仕組みの詳細は省きます。でも、charは数字型なので、intやdoubleなどの間でこのようなキャストができることは、頭の片隅に入れておきましょう。
プリミティブ型同士のキャストのロジックは以下の記事でも触れていますので、参考にしてください。
関連記事2-2.charのリテラル表現のいろいろ
2-2-1.10進数、2進数、8進数、16進数での表現
Javaでは、数字は10進数以外にも、2進数、8進数、16進数で表現できます。charで扱える0~65535の範囲内なら、それらの表現でも意味は同じです。16進数なら、後述するUnicodeのコードポイントと見た目の値が同じになるので(※)、分かりやすくなるケースもあるかもしれませんね。
// いずれも65(文字のA)を、見た目の表現を変えて書いているだけ char c0 = 65; // 10進数 char c1 = 0b0100_0001; // 2進数(Java 7以降、0b始まり、"_"で区切ることもできる) char c2 = 0101; // 8進数(0始まり) char c3 = 0x41; // 16進数(0x始まり) System.out.println(c0); // → A System.out.println(c1); // → A System.out.println(c2); // → A System.out.println(c3); // → A
※もう少し正確にお伝えするなら、charを数字のリテラルで記述する場合は、UTF-16というエンコーディングでの数字であって、コードポイントとは必ずしも同じになりません。例えば、後述するサロゲートペアの範囲の文字は違う値になります。
2-2-2.文字の数字はシングルクォーテーションでくくっても表せる
Javaでは一つの文字に対する数字を、シングルクォーテーション(‘)でくくっても表せます。ずっとお伝えしているとおり、charは整数のデータ型ですが、数字そのままでは文字が何か分かりづらいので、文字そのものでの表現もできるのです。
char c1 = 'A'; // 数字で65と書く代わりに、'A'でも同じ意味になる char c2 = 'B'; // 66の代わりに'B' char c3 = 'あ'; // 12354の代わりに'あ' System.out.println(c1); // → A System.out.println(c2); // → B System.out.println(c3); // → あ
”で数字の代わりに表現できるのは一文字だけです。複数の文字を”でくくってしまうとコンパイルエラーになります。文字を“”(ダブルクォーテーション)でくくるとStringになるのですが、JavaではcharとStringは違うモノなので相互に代入はできず、こちらもコンパイルエラーになります。
char c1 = 'AB'; // → コンパイルエラー "文字定数が無効です" char c2 = "A"; // → コンパイルエラー "Stringからcharには変換できません" String s = 'A'; // → コンパイルエラー "charからStringには変換できません"
”でくくられたモノは、Javaのプログラム上ではその文字が表す数字として扱われます。ですので、以下のif文はtrueになりますし、“-“を付けたり-1と掛け算すればマイナスの数字になりますし、char同士を足し算できたりします。これで、文字は数字の別表現なのだと、おわかりいただけたでしょうか。
// 'X'は内部的には数字なので、数字と比較できる if ('A' == 65) { System.out.println("'A' == 65です"); // こちら!! } else { System.out.println("'A' == 65ではありません"); } // 'X'は内部的には数字なので、計算ができる int i1 = -'A'; int i2 = 'a' * -1; int i3 = 'A' + 'a'; System.out.println(i1); // → -65 System.out.println(i2); // → -97 System.out.println(i3); // → -162、文字列の"Aa"にはならない
2-2-3.特殊な文字はエスケープシーケンスで表す
ある種の文字は、直接ソースコード上に書いても目に見えづらかったり、扱いづらかったりします。例えばタブや改行です。それらの文字を表現するには、「\」と組み合わせた、エスケープシーケンスという特別な書き方があります。エスケープシーケンスでの文字の表現は、Stringの中でも使えます。
- バックスペース \b (\u0008でも同じ)
- 水平タブ \t (\u0009でも同じ)
- 改行 \n (\u000aでも同じ)
- 改ページ \f (\u000cでも同じ)
- 復帰 \r (\u000dでも同じ)
- ダブルクォーテーション \” (\u0022でも同じ)
- シングルクォーテーション \’ (\u0027でも同じ)
- \文字 \\ (\u005cでも同じ)
// 印字が難しい文字はエスケープシーケンスでも表せる char c1 = '\b'; char c2 = '\t'; char c3 = '\n'; char c4 = '\f'; char c5 = '\r'; char c6 = '\"'; char c7 = '\''; char c8 = '\\'; // Stringリテラルでも同じ書き方ができる String s1 = "\b"; String s2 = "\t"; String s3 = "\n"; String s4 = "\f"; String s5 = "\r"; String s6 = "\""; String s7 = "\'"; String s8 = "\\";
2-2-4.Unicodeのコードポイントでの文字指定
Unicodeの文字には、一つ一つに数字が割り当てられています。その数字をコードポイント(codepoint)と呼びますが、charを使う上でもコードポイントが使えます。コードポイントで文字を表す場合は、Javaでは「\u + コードポイント」を使い、これはUnicodeエスケープとも呼ばれます。
【参考】List of Unicode characters
https://en.wikipedia.org/wiki/List_of_Unicode_characters
【参考】Code Charts
例えば、‘あ‘のUnicodeコードポイントは「U+3042」なので、Unicodeエスケープでは「\u3042」です。コードポイントを使えば、日本語環境では入力が難しい文字もリテラルで表現できます。そして、コードポイントでの文字の表現は、Stringの中でも使えます。
char c1 = '\u3042'; // → 'あ' char c2 = '\u00C6'; // → 'Æ'(AとEが合わさった文字) System.out.println('あ' == '\u3042'); // → true System.out.println(0x3042 == '\u3042'); // → true System.out.println('Æ' == '\u00C6'); // → true System.out.println(0x00C6 == '\u00C6'); // → true String s = "\u3042\u00C6"; // → "あÆ"、Stringリテラルでも同じ書き方ができる
2-2-5.【参考】2つのcharで表現するサロゲートペア
コードポイントとUTF-16のcharが表す数字は基本的には同じです。ただ、ごく初期のUnicodeならすべての文字でそれが通じましたが、Unicode 2.0で追加された「サロゲートペア(代用対)」と呼ばれる範囲(いわゆる追加面)の文字は違います。
サロゲートペアの範囲にある文字は1つのcharでは表現できず、2つのcharのペア(組み合わせ)で表現します。char配列の長さもその分伸びます。コードポイントも16ビットの範囲を超えたところにありますので、コードポイントの数字をJava上で表すならintを使うことになります。
サロゲートペアの詳細はこの記事の範囲を超えますので、説明は省略します。でも、いわゆる?(つちよし)や?(ほっけ)はサロゲートペアの範囲にある文字ですし、絵文字もそうです。これらの文字の範囲をプログラムで扱う場合は、サロゲートペアについて学んでおくといいでしょう。
// ?(U+20BB7)はサロゲートペアと呼ばれる範囲にある文字で、1つのcharでは表現できない char c0 = '?'; // → コンパイルエラー、この文字は0~65535の範囲内ではないため // サロゲートペアの文字は、JavaのUnicodeエスケープでも表現できない char c1 = '\u20BB7'; // → コンパイルエラー、これは\u20BBと7に解釈されてしまう String s1 = "\u20BB7"; // → コンパイルエラー、理由は同上 // サロゲートペアの文字は、2つのcharが「ペア」になって1つの文字になる char[] c2 = { 0xD842, 0xDFB7 }; // 1つの文字を表すのに長さ2のchar配列が必要 String s2 = "\uD842\uDFB7"; System.out.println(c2); // → ? System.out.println(s2); // → ? // サロゲートペアの文字のコードポイントは、32ビットのintで表現する int i = 0x20BB7; String s3 = String.format("%c", i); // → "?" String s4 = Character.toString(i); // → "?"、Java 11より使用可能
2-3.charは==で比較する
charを比較する時は、値を比較する演算子の==を使います。charはそれ自体が一つの数字なので、単純に数字として比較すれば同じ文字か分かります。
charは何かのクラスのインスタンスではありませんので、==で安全に比較できるのです。もちろん、大小関係を判断する > >= < <=なども、他の数字に使う場合と同じように使えます。
char c1 = 'A'; char c2 = 65; if (c1 == c2) { System.out.println("c1 == c2です"); // こちら!! } else { System.out.println("c1 == c2ではありません"); }
2-3-1.charとStringはどちらかに寄せて比較する
繰り返しですが、charとStringはJavaでは違うモノなので、==では比較できません。String.equalsによる比較でも、もちろんfalseになります。
char c = 'A'; String s = "A"; /* // charとStringでは==はできない(コンパイルエラー) if (c == s) { System.out.println("c == sです"); } else { System.out.println("c == sではありません"); } */ // charがCharacterにオートボクシングされるので、コンパイルは通るし実行もできる。 // だが、StringとCharacterではクラスが違うので、等しいとはみなされない。 if (s.equals(c)) { System.out.println("s.equals(c)です"); } else { System.out.println("s.equals(c)ではありません"); // こちら!! }
charとStringを比較するなら、以下のようにcharかStringのどちらかに寄せなければなりません。charとStringの変換方法については後述します。
char c = 'A'; String s = "A"; String strFromChar = String.valueOf(c); char charFromStr = s.charAt(0); // String同士ならequalsで確認できる if (s.equals(strFromChar)) { System.out.println("s.equals(strFromChar)です"); // こちら!! } else { System.out.println("s.equals(strFromChar)ではありません"); } // char同士なら==で確認できる if (c == charFromStr) { System.out.println("c == charFromStrです"); // こちら!! } else { System.out.println("c == charFromStrではありません"); }
3.charとStringの使い方いろいろ
この章では、Javaのプログラミング上でよく見かける、charとStringを関連させて使うパターンを紹介します。
Javaではcharをそれ単独で使うことはあまりありません。charを最終的にStringにしたり、Stringからcharを取り出すなど、charとStringを組み合わせて使うことが普通です。
3-1.charをStringに変換する
charの一文字をStringに変換するには、String.valueOf(char)あるいはCharacter.toString(char)を使うと簡単です。
char c = 'A'; String s1 = Character.toString(c); String s2 = String.valueOf(c); System.out.println(s1); // → "A" System.out.println(s2); // → "A"
3-2.複数のcharを一つのStringに変換する
char同士を+しただけでは、charで表している文字が繋がったStringにはできません。charが表す数字を足し合わせた値を持つintになるだけです。
このやり方はいろいろあって、“”を間に挟む、String.valueOfをして+する、StringBuilderを使う、String.formatを使う…などがあります。後述する、char配列からStringを作る方法でも構いません。
char c1 = 'A'; char c2 = 'B'; // String s1 = c1 + c2; // コンパイルエラー!! c1 + c2はintになり、intから直接Stringにはできない String s2 = c1 + "" + c2; String s3 = String.valueOf(c1) + String.valueOf(c2); // String.valueOfはどちらか片方でもいい String s4 = new StringBuilder().append(c1).append(c2).toString(); String s5 = String.format("%c%c", c1, c2); String s6 = new String(new char[] { c1, c2 }); System.out.println(s2); // → "AB" System.out.println(s3); // → "AB" System.out.println(s4); // → "AB" System.out.println(s5); // → "AB" System.out.println(s6); // → "AB"
3-3.charの配列をStringに変換する
charの配列をStringに変換するには、StringのコンストラクタのString(char[])を使うといいでしょう。
char[] c = {'A', 'B', 'C'}; String s = new String(c); System.out.println(s); // → "ABC"
あるいは、StringBuilderにcharの配列をappendした後にtoStringすれば、他の文字・文字列ともお手軽につなげられます。
char[] c = {'A', 'B', 'C'}; StringBuilder sb = new StringBuilder(); sb.append(c); String s = sb.toString(); System.out.println(s); // → "ABC"
3-4.Stringから指定インデックスのcharを取得する
Stringから、指定したインデックスにあるcharを取得するには、String.charAtを使います。Stringのインデックス範囲外の数字を指定すると、メソッド呼び出し時に例外が発生するので気を付けましょう。
String s = "ABC"; // [0:A、1:B、2:C] char c = s.charAt(1); // インデックス1の場所にあるcharを取得する System.out.println(s); // → B!!
3-5.Stringをcharの配列に変換する
Stringをcharの配列に変換するなら、String.toCharArrayを使うのがお手軽です。
String s = "ABC"; char[] c = s.toCharArray(); System.out.println(c); // → [A, B, C]
3-6.Stringとcharを連結する
Stringとcharは、+を使えば二つをつなげた新しいStringが作られます。結果の文字列では、charが数字になることはありませんので、ご安心を。もちろん、StringBuilderなどを使ってつなげても構いません。
char c1 = 'A'; char c2 = 'C'; String s1 = "B"; String s2 = c1 + s1 + c2; System.out.println(s2); // → "ABC"
3-7.charを2進数、10進数、8進数、16進数の文字列に変換する
プログラムのデバッグなどで、charを文字ではなく、2進数、8進数、10進数、16進数で出力したい時があります。特に文字コード表は16進数のことが多いので、文字そのものよりも16進数の方が便利なことがあります。
いずれのパターンでも、Javaの標準APIだけを使うなら、String.formatを使うと簡単でしょう。2進数の場合は、Integer.toBinaryStringを組み合わせると楽にできます。
char c = 'A'; String s1 = String.format("%16s", Integer.toBinaryString(c)).replace(" ", "0"); // 2進数 String s2 = String.format("%06o", (int) c); // 8進数 String s3 = String.format("%d", (int) c); // 10進数 String s4 = String.format("%02x", (int) c); // 16進数 System.out.println(s1); // → "0000000001000001" System.out.println(s2); // → "000101" System.out.println(s3); // → "65" System.out.println((int) c); // → 65、10進数でprintするだけなら、単にintやshortへキャストするだけでも可 System.out.println(s4); // → "41"
5.charとCharacter
Javaでは16ビットの整数を表現するために、charとCharacterおよびshortとShortの四つの方法があります。
charとshortは文字と数字の違いなのでそういうように使い分ければいいとして、Javaプログラミングの初心者は、なぜ同じ文字の表し方がcharとCharacterで二つあるのか混乱すると思います。
この章ではその理由と、charとCharacterの使い分けの方針などをお伝えします。
5-1.二種類の表現方法は性能確保のため
Javaではプリミティブ型のcharと、クラスのCharacterは別物です。C#などではこういう区別がないのに、なぜJavaではあるのか。これは、Javaが生まれた当時にプログラムの実行速度を確保するためでした。
Javaは1995年に登場したプログラミング言語です。当時のCPUのクロック周波数は今とは桁が違い、一般向けのCPUでようやく100MHzを超えたくらい。メモリの量も全体で数MB~数10MBと非常に乏しかったものです。
charは16ビットの数字そのものなので、楽に速く扱えます。しかし、charをクラスとすると、一つのcharの数字を表すのに16ビットよりもずっと多くのメモリを使います。簡単な計算をするにも、処理上では余分なオーバーヘッドが発生します。
5-2.クラスのCharacterならnullを表現できる
JavaでCharacterを使うのは、値がない場合…すなわちnullを表現したい時です。例えば、SQLでは値の有り無しをNULLかどうかで表現できますが、それをJavaのcharでは上手に表現できません。charには必ず何かの値があるからです。なお、ここでのnullは、文字あるいは数字としての0x00とは別のものです。
そういう時に参照型であるCharacterを使えば、値がないことをnullとして表現できます。Characterをどういう時に使うべきか分からない方は、その変数でnullを表現する必要があるかを一つの指針にしてみてください。
あとCharacterを使うのは、Characterが持つメソッドを使いたい時と、List・Map・SetなどのCollectionフレームワークを使いたい時です。Collectionフレームワークはクラスが対象ですので、Characterを使います。後述するオートボクシングにより、使い分けをあまり意識せずに済むようになりました。
5-3.オートボクシングでcharとCharacterを自動変換する
Java 1.5でオートボクシング(auto boxing)という仕組みが導入されました。オートボクシングで、charとCharacterをプログラム上でほぼ同じものとして扱えます。
プログラム上でcharを使う所ではCharacterを使えますし、Characterを使う所ではcharが使えます。本当のプログラム上は相変わらずcharとCharacterは別物なのですが、その違いをJavaが裏で自動的に変換をしてくれるのです。
Character charObj = Character.valueOf("12345"); // Character char charPri = 65535; // char charPri = charObj; // → 12345、charにCharacterを代入できる charPri = new Character("65535"); // → 65535、同上 charObj = 12345; // → 12345、Characterにcharを代入できる
これでJavaの面倒な部分がある程度解消されました。ですが、前述のとおりCharacterはnullを表せますが、charは必ず何かの整数なので、nullに相当するものがありません。
ですので、以下のように予期せぬところでNullPointerExceptionが発生したりします。これは2019年のJava 11の時点でも変わっていません。プログラマが注意するか、Optionalを使う必要があります。
class IntTest { static Character returnCharacter() { return null; } public static void main(String[] args) { char i = returnCharacter(); // → nullをcharに変換できないので、実行するとNullPointerExceptionが発生する!! } }
5.まとめ
この記事では、Javaのcharに関する情報をお伝えしてきました。charは16ビットの整数で、0~65535の範囲でUnicode・UTF-16での一文字を表します。charの表し方はいろいろありますが、結局のところ、一つの数字がいろいろな見た目をしているにすぎません。
JavaではcharとStringは違うものなので、比較したりする場合はどちらかに変換しなければなりません。charからStringを作ったり、Stringからcharを取り出したりする方法なども、普通にプログラムを作る上で必要と思われるものをお伝えしてきました。
なお、この記事では、Unicodeのもう少し深い知識、例えばサロゲートペアの詳細、結合文字、正規化、双方向テキスト、包摂、異体字セレクタなどには触れませんでした。Javaに限らずUnicodeを本格的に扱うには、それらの知識も必要となることがあります。
JavaのcharとStringとUnicodeは一心同体なので、この記事を足掛かりに、Javaで文字を扱うために必要な知識を身に着けていってください。
コメント