1. 基本的な特殊文字とエスケープ
プログラミングにおける文字列は、文字だけでなく、引用符・改行・タブといった特殊文字を含みます。たとえば \n や \t のような記号です。もし文字列の中に こんにちは, "user"! と書きたくなったら、コンパイラはこう考えます。「文字列の中の引用符はエラーでは?」。そこで必要になるのがエスケープの仕組みです。
Java における エスケープ とは、文字列中の特定の文字に「特別な意味づけ」を行う方法です。そのために逆スラッシュ \(別名「backslash」)を使います。
よく使うエスケープシーケンス:
| シーケンス | 説明 | デモ |
|---|---|---|
|
改行 | Enter を押す |
|
タブ | Tab |
|
文字通りの「バックスラッシュ」 | |
|
文字列内の二重引用符 | |
|
単一引用符(文字列ではまれに必要) | |
|
復帰(古い改行スタイル。まれに使用) | |
|
Null 文字 | (不可視) |
|
Backspace(直前の文字を削除 — コンソールでは常に機能するとは限らない) |
仕組み
実際にエスケープした文字を含む行をいくつか書いて、挙動を見てみましょう。
System.out.println("こんにちは, \"ユーザー\"!");
// 出力: こんにちは, "ユーザー"!
System.out.println("C:\\Program Files\\MyApp");
// 出力: C:\Program Files\MyApp
System.out.println("行 1\n行 2");
// 出力:
// 行 1
// 行 2
System.out.println("私は\tタブが\t好きです!");
// 出力:
// 私は タブが 好きです!
このように、たった1本のスラッシュ(\)で、ほとんどの特殊文字を安全に文字列へ「持ち込む」ことができ、コンパイラやチームメイトを混乱させずに済みます。
2. 複数行文字列と改行
複数行のメッセージや ASCII アートを書きたい場面はよくあります。最も単純なのは、通常の文字列内で \n を使う方法です。
System.out.println("1 行目\n2 行目\n3 行目");
しかし毎回これでは不便なので、Java には テキストブロック(Text Blocks)が導入されました。トリプルクォート """ で開始し、エスケープせずに複数行テキストをそのまま書けます。JSON、SQL、HTML に最適です。
// 複数行リテラル(Text Block)
String json = """
{
"name": "Alice",
"age": 30,
"skills": ["Java", "SQL", "Cloud"]
}
""";
System.out.println(json);
"""
テキストブロックなら、引用符を含む複数行テキストも簡単に書け、引用符を重ねてエスケープする必要がありません.
3. Unicode — Java で世界中の文字を扱う
現代では、ラテン文字だけでなく、キリル文字・漢字・数学記号・絵文字なども扱います。これを可能にしているのが文字コード体系である Unicode です。
Unicode とは?
Unicode は、言語やプラットフォームに依存せず、あらゆる文字に固有の番号(code point)を割り当てる国際標準です。これにより Java で、キリル文字・英語・中国語の漢字・珍しい記号まで同時に安全に扱えます。
多言語の文字列例:
System.out.println("Hello, 世界! 你好! مرحبا!");
文字列中の Unicode 文字
使用しているエンコーディングがサポートしている文字なら直接書けますし、\uXXXX(XXXX は4桁の16進)というエスケープシーケンスでも表記できます。
System.out.println("文字: \u263A"); // 出力 😊
コードポイントが 65535 を超える文字(多くの絵文字など)は、UTF-16 ではサロゲートペア(2 つの char)で表されます:
// 絵文字 😊(コード 1F60A)は 2 つの char で表現される
System.out.println("絵文字: \uD83D\uDE0A"); // 出力 😊
これで何が嬉しい?
- 任意のテキストを保存・処理できます。
- 言語を混在させたり珍しい記号を使っても心配無用 — Java は Unicode を標準でサポートします。
- 国際ユーザーや非標準のアルファベットを扱う際に特に重要です。
4. 絵文字と特殊記号を文字列で扱う
いまどきの文字列は文字だけではありません。絵文字も使えます。たとえば、ユーザーに楽しい「スマイル」を送りたいとき。
文字列に絵文字を入れるには?
絵文字をそのまま文字列に入れる:
System.out.println("こんにちは! 😊");
Unicode コードを使う: 多くの絵文字はサロゲートペアのシーケンスで表せます。
System.out.println("猫はこちら: \uD83D\uDC31"); // 🐱
絵文字は(UTF-16 のため)文字列中で 2 文字分を占めることがあります。そのため、長さを求めるときなどに驚くことがあります:
String s = "😊";
System.out.println(s.length()); // 2 が出力されます。1 ではありません!
これは 1 つの Unicode code point が Java では 2 つの char によって符号化されるためです。文字を正しく扱うには、単純な length() ではなく code point と対応するメソッドを使ってください。
5. 落とし穴とよくあるミス
エラー1: 文字列内の引用符の扱いが誤っている。 内側の引用符をエスケープしないと、コンパイラは「文字列が終わった」と判断します。
System.out.println("彼は言った: "こんにちは!""); // エラー!
正しい書き方:
System.out.println("彼は言った: \"こんにちは!\"");
エラー2: パスにバックスラッシュを 1 つだけ書く。 Java では \ は特殊文字用(\n、\t、\f など)に使われます。したがって、"C:\Temp\file.txt" のような文字列は誤って解釈されます。
System.out.println("C:\Temp\file.txt"); // エラーまたは予期しない結果
正しい書き方:
System.out.println("C:\\Temp\\file.txt"); // 二重スラッシュ
エラー3: テキストブロックを使わない。 Java 15 以降は テキストブロック を使いましょう — 複数行の文字列がとても簡単になります。
String path = """
C:\Temp\file.txt
""";
System.out.println(path);
最重要ルール: 特殊文字と引用符は常にエスケープしましょう。これで隠れたバグを防ぎ、デバッグ時間を大幅に節約できます。
GO TO FULL VERSION