1. 文字をエスケープする理由

かつて、コードで文字列を記述するには、文字列を二重引用符で囲む必要があることを学びました。結果は文字列リテラルになります。

しかし、文字列リテラル内に引用符が必要な場合はどうすればよいでしょうか? 引用符を含む文字列 — もっと簡単なものはないでしょうか?

テキストを表示したいとしましょう"Friends" was nominated for an "Oscar"。どうやってそれを行うのですか?

コード ノート
String s = ""Friends" was nominated for an "Oscar"";
このオプションは機能しません。

問題は、コンパイラがまったく予期しないコードを書いていると判断することです。

コード ノート
String s = ""Friends" was nominated for an "Oscar"";
このオプションは機能しません。

コンパイラーは、コード内で二重引用符を検出すると、その後に続くものを文字列リテラルの先頭として扱います。次の二重引用符は、文字列リテラルの終わりを示します。

では、リテラルの中に二重引用符を記述するにはどうすればよいでしょうか?


2. 文字のエスケープ

やり方がある。これはエスケープ文字と呼ばれます。テキスト文字列内に引用符を記述するだけです。引用符の前に\(バックスラッシュ) 記号を追加します。

文字列リテラルを正しく記述すると、次のようになります。

コード ノート
String s = "\"Friends\" was nominated for an \"Oscar\"";
これはうまくいきます!

コンパイラはすべてを正しく解釈し、バックスラッシュの後の引用符を通常の引用符とはみなしません。

さらに、この文字列を画面に出力すると、バックスラッシュを含む引用符は正しく処理され、テキストはバックスラッシュなしで表示されます。"Friends" was nominated for an "Oscar"

もう一つ重要な点があります。バックスラッシュが前にある引用符は 1 つの文字を表します。コード内の文字列リテラルを認識するコンパイラーの機能を妨げない洗練された表記法を使用しているだけです。変数に引用符を割り当てることができますchar

コード ノート
char c = '\"';
\"2 文字ではなく 1 文字です
char c = '"';
これも可能です:単一引用符の中に二重引用符を入れる

3. 文字をエスケープするときに発生する一般的な状況

文字のエスケープが関係する一般的な状況

二重引用符に加えて、コンパイラーが特別な方法で処理する文字が他にもたくさんあります。たとえば、改行です。

リテラルに改行を追加するにはどうすればよいでしょうか? これには特別な組み合わせもあります。

\n
改行文字

文字列リテラルに改行を追加する必要がある場合は、次の文字をいくつか追加するだけです\n

例:

コード コンソール出力
System.out.println("Best regards, \n Anonymous");
             
Best regards,
Anonymous

このような特殊な組み合わせは合計 8 つあり、エスケープ シーケンスとも呼ばれます。どうぞ:

コード 説明
\t タブ文字を挿入する
\b バックスペース文字を挿入する
\n 改行文字を挿入する
\r 復帰文字を挿入する
\f ページ送り文字を挿入する
\' 一重引用符を挿入します
\" 二重引用符を挿入します
\\ バックスラッシュを挿入する

そのうちの 2 つはよく知られていますが、残りの 6 つは何を意味しますか?

\tタブ文字です

このテキストがテキスト内に表示される場合、入力中にキーを押すことと同じになりますTab。後続のテキストを移動し、テキストを整列させることができます。

例:

コード コンソール出力
System.out.println("0\t1\t2\t3");
System.out.println("0\t10\t20\t30");
System.out.println("0\t100\t200\t300");
0       1        2        3
0       10       20       30
0       100      200      300

\b「1文字戻る」を意味します

文字列内のこのシーケンスは、Backspaceキーボードのキーを押すことと同じです。その前にある文字が削除されます。

コード コンソール出力
System.out.println("Hello\b\b World");
Hell World!

\rはキャリッジリターン文字です

この文字は、テキストを変更せずにカーソルを現在の行の先頭に移動します。次に表示される文字列は、既存の文字列を上書きします。

例:

コード コンソール出力
System.out.println("Greetings\r World!");
World!

\fページ送り文字です

このシンボルは、最初のドットマトリックス プリンターの時代から私たちに受け継がれています。このシーケンスをプリンタに出力すると、プリンタは新しいページが始まるまでテキストを印刷せずに現在のシートを送り出すだけになります。

今では、これを改ページまたは新しいページと呼びます。

\\バックスラッシュです

ここではすべてが簡単です。テキスト内の文字をエスケープするためにバックスラッシュを使用する場合、文字列内にバックスラッシュ文字自体を記述するにはどうすればよいでしょうか?

やり方は簡単です。テキストにバックスラッシュを追加します。2 つ続けて記述する必要があります。

例:

コード コンソール出力
System.out.println("c:\projects\my\first");
コンパイラは、不明なエスケープ文字があると警告を発します。
System.out.println("c:\\projects\\my\\first");
それが正しいやり方です!


4. Unicodeエンコーディング

すでにご存知のとおり、画面に表示される各文字は特定の数値コードに対応しています。これらのコードの標準化されたセットは、エンコーディングと呼ばれます。

かつて、コンピューターが新しく発明されたとき、すべての文字をエンコードするには 7 ビット (1 バイト未満) で十分でした。最初のエンコーディングには 128 文字しか含まれていませんでした。このエンコーディングはASCIIと呼ばれていました。

ASCII は、 American Standard Code for Information Interchange の略で、印刷可能な文字と一部の特殊コード用の米国の標準コード テーブルです。

これは、33 個の印刷不可能な制御文字 (テキストとスペースの処理方法に影響します) と、数字、大文字と小文字のラテン文字、およびいくつかの句読点を含む 95 個の印刷可能な文字で構成されます。

Unicode エンコーディング

コンピューターの普及に伴い、各国が独自のエンコーディングをリリースし始めました。通常、彼らは ASCII を出発点として、めったに使用されない ASCII 文字をそれぞれのアルファベットの記号に置き換えました。

時間が経つにつれて、世界中のあらゆるエンコーディングのすべての文字を含む単一のエンコーディングを作成するというアイデアが浮かび上がりました。

Unicode エンコード 1

そのため、1993 年にUnicodeエンコードが作成され、Java 言語がこのエンコードをテキスト保存の標準として使用する最初のプログラミング言語となりました。現在、Unicode は IT 業界全体の標準です。

Unicode 自体は標準ですが、UTF-8、UTF-16、UTF-32 など、いくつかの表現または Unicode 変換形式 (UTF) があります。

Java は、Unicode エンコードの高度なバージョンである UTF-16 を使用します。各文字は 16 ビット (2 バイト) でエンコードされます。最大 65,536 文字を収容できます。

このエンコーディングでは、世界中のすべてのアルファベットのほぼすべての文字を見つけることができます。当然のことながら、すべてを暗記している人はいません。すべてを知ることはできませんが、すべてをグーグルで調べることはできます。

コードを使用してプログラムに Unicode 文字を書き込むには、\u+コードを 16 進数で記述する必要があります。例えば、\u00A9

コード コンソール出力
System.out.println("\u00A9 CodeGym");
© CodeGym


5. Unicode: コードポイント

「640 キロバイトあれば誰にとっても十分なはずです。そうでないかもしれません。」(ビル・ゲイツによる引用)

人生は大変で、時間が経つにつれて、UTF-16 エンコードが不適切になり始めました。アジアにはたくさんの言語があり、それらにはたくさんのグリフがあることがわかりました。そして、これらすべてのグリフを 2 バイトに詰め込むことはできません。

何ができるでしょうか?もっと多くのバイトを使用してください!

しかし、char 型はわずか 2 バイトであり、これを 4 バイトに変更するのはそれほど簡単ではありません。世界中で数十億行の Java コードが記述されており、Java マシンで char 型が突然 4 バイトになるとコードが壊れてしまいます。したがって、char 型を変更することはできません。

別のアプローチもあります。文字の前にバックスラッシュを置くことで文字をエスケープする方法を思い出してください。基本的に、単一の文字を複数の文字を使用してエンコードしました。

Java の作成者は、同じアプローチを使用することにしました。

視覚的には 1 文字として見える一部の文字は、char文字列内の 2 つの としてエンコードされます。

コード コンソール出力
System.out.println("\uD83D\uDD0A");
🔊

これで、Java プログラムは絵文字をコンソールに出力することもできます 😎