CodeGym /コース /JAVA 25 SELF /文字のエスケープ

文字のエスケープ

JAVA 25 SELF
レベル 9, レッスン 1
使用可能

1. 基本的な特殊文字とエスケープ

プログラミングにおける文字列は、文字だけでなく、引用符・改行・タブといった特殊文字を含みます。たとえば \n や \t のような記号です。もし文字列の中に こんにちは, "user"! と書きたくなったら、コンパイラはこう考えます。「文字列の中の引用符はエラーでは?」。そこで必要になるのがエスケープの仕組みです。

Java における エスケープ とは、文字列中の特定の文字に「特別な意味づけ」を行う方法です。そのために逆スラッシュ \(別名「backslash」)を使います。

よく使うエスケープシーケンス:

シーケンス 説明 デモ
\n
改行 Enter を押す
\t
タブ Tab
\\
文字通りの「バックスラッシュ」
\
\"
文字列内の二重引用符
"
\'
単一引用符(文字列ではまれに必要)
'
\r
復帰(古い改行スタイル。まれに使用)
\0
Null 文字 (不可視)
\b
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);
Java のテキストブロック """

テキストブロックなら、引用符を含む複数行テキストも簡単に書け、引用符を重ねてエスケープする必要がありません.

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);

最重要ルール: 特殊文字と引用符は常にエスケープしましょう。これで隠れたバグを防ぎ、デバッグ時間を大幅に節約できます。

1
タスク
JAVA 25 SELF, レベル 9, レッスン 1
ロック未解除
バックスラッシュを含むファイルパス
バックスラッシュを含むファイルパス
1
タスク
JAVA 25 SELF, レベル 9, レッスン 1
ロック未解除
特殊文字を使った複数行の出力
特殊文字を使った複数行の出力
1
タスク
JAVA 25 SELF, レベル 9, レッスン 1
ロック未解除
文字列内のタブと引用符
文字列内のタブと引用符
1
タスク
JAVA 25 SELF, レベル 9, レッスン 1
ロック未解除
文字列内のUnicode文字と絵文字
文字列内のUnicode文字と絵文字
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION