Codegym University コースの一部としてのメンターによる講義の抜粋。フルコースにお申し込みください。


「こんにちは、アミーゴ。かつて、コードで文字列を記述するには、文字列を二重引用符で囲む必要があることを学習しました。」

「はい、それで文字列リテラルが得られます。私がこのことを知ったのは、それほど昔のことではありません。」

「私たちの職業では、それはずっと前のことです。しかし、今はそれが重要ではありません。代わりに、文字列リテラル内に引用符が必要な場合はどうすればよいかを教えてください。」

「うーん...引用符を含む文字列 — もっと簡単なことはないでしょうか。きっと何か方法があると思います...」

「はい。テキストを表示したいとしましょう"Friends" was nominated for an "Oscar"。どうすればよいでしょうか?」

「正直に言うと、全く分かりません。何も思いつきません。」

「論理的に解決することはできません。何をすべきかを教えてみましょう。

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

「コンパイラはこれをまったく別のコードとして解釈するため、このオプションは機能しません。

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

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

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

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

「文字列リテラルを正しく書くと次のようになります。

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

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

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

「まあ、超便利とまでは言いませんが……」

「しかし、何ができるか、それがルールです。もう 1 つの重要な点です。バックスラッシュが前にある引用符は 1 つの文字を表します。私たちは単に、コンパイラが文字列リテラルを認識する能力を妨げない滑らかな表記法を使用しているだけです。変数に引用符を割り当てることができますchar

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

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

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

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

\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");
Hel World

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

この文字は、テキストを変更せずにカーソルを現在の行の先頭に移動します (JDK のバージョンによって異なります)。次に表示される文字列は、既存の文字列を上書きします。

例:

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

\fページ送り文字です

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

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

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

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

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

例:

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

「二重スラッシュを使用することは理にかなっています。しかし、他のすべてをすぐに覚えることができませんでした。あなたのヒントに頼る必要があります。」

「徐々に、必要なことを思い出すでしょう。心配しないでください。それ以外のことについては、Google が必要です。

Unicode エンコーディング

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

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

「変な名前ですね。」

「何もおかしなことはありません。これは略語です。ASCII は、American Standard Code for Information Interchange の略です。印刷可能な文字と一部の特殊コードを表す米国の標準コード表です。」

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

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

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

Unicode エンコーディング

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

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

「Java は、Unicode エンコードの高度なバージョンである UTF-16 を使用します。各文字は 16 ビット (2 バイト) でエンコードされます。最大 65,536 文字を収容できます。このエンコードでは、世界中のすべてのアルファベットのほぼすべての文字を見つけることができます。」 」

「暗記する必要がなければいいのですが?」

「やりたいなら、やってみろ!」

「わかりました。このルールを使用します。すべてを知ることはできませんが、すべてを Google で検索することはできます。」

\u「合理的なアプローチを採用することがすべてです。したがって、そのコードを使用してプログラムに Unicode 文字を書き込むには、 +コードを 16 進数で記述する必要があります。たとえば、次のようになります。\u00A9

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

Unicode: コードポイント

「640 キロバイトあれば誰にとっても十分なはずです。そうでないかもしれません。」ビル・ゲイツはかつてこう言いました。か否か。少なくともこの言葉は彼によるものです。」

「ははは。640 キロバイトでは、掃除ロボットの脳に負荷をかけるのに十分ではありません。」

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

"どうしようか?"

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

「別のアプローチがあります。文字の前にバックスラッシュを入れて文字をエスケープする方法を思い出してください。基本的に、私たちは複数の文字を使用して 1 つの文字をエンコードしました。Java の作成者は、同じアプローチを使用することにしました。」

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

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

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

ぜひ楽しんで使わせていただきます!