CodeGym /Java Blog /ランダム /Java エスケープ文字
John Squirrels
レベル 41
San Francisco

Java エスケープ文字

ランダム グループに公開済み
やあ!これまでのレッスンで、 Java のStringクラスで表されるテキスト文字列についてすでに学習しました。おそらく覚えていると思いますが、文字列は一連の文字です。これらの文字には、任意の文字、数字、句読点などを使用できます。文字列を作成するときの主な点は、シーケンス全体を引用符で囲む必要があることです。

public class Main {
   public static void main(String[] args) {
       String alex = new String ("My name is Alex. I'm 20!");
   }
}
しかし、それ自体に引用符を含める必要がある文字列を作成する必要がある場合はどうすればよいでしょうか? たとえば、あなたのお気に入りの本について世界に伝えたいとします。

public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("My favorite book is "Twilight" by Stephanie Meyer");
   }
}
コンパイラが何か不満を持っているようです。問題は何だと思いますか? そしてそれは引用符と何の関係があるのでしょうか?実際、それはすべて非常に簡単です。コンパイラは引用符を非常に特殊な方法で解釈します。つまり、文字列が引用符で囲まれることを期待します。そしてコンパイラーは、" を見つけるたびに、その引用符の後に 2 番目の引用符が続き、それらの間の内容がコンパイラーによって作成される文字列のテキストであることを期待します。この場合、前後の引用符は"Twilight" という単語は他の引用符で囲まれています。コンパイラがこのテキストに到達したとき、コンパイラは何を行うことが期待されているのか理解できません。引用符は文字列を作成する必要があることを示唆しています。しかし、それがコンパイラの機能です。すでにやってる!その理由は次のとおりです。簡単に言うと、コンパイラーは、何を実行することが期待されているかについて混乱してしまいます。 「また引用符ですか? これは何かの間違いですか? すでに文字列を作成中です! それとも別の文字列を作成する必要がありますか? ああ!...:/」 引用符がコマンドであることをコンパイラーに知らせる必要があります ( "文字列を作成してください!")、それが単なる文字の場合 ("Twilight" という単語を引用符と一緒に表示してください!")。これを行うために、Java は文字エスケープを使用します。これは、特殊記号\を使用して実行されます。この記号は通常「バックスラッシュ」と呼ばれます。Java では、「エスケープ」される文字と組み合わせられたバックスラッシュを、制御シーケンスと呼びます。たとえば、画面上に引用符を表示するための制御シーケンスです。コード内でこの構造に遭遇すると、コンパイラはこれが画面に表示されるべき単なる引用符であることを理解します。この本を使ってコードを変更してみましょう。

public static void main(String[] args) {
       String myFavoriteBook = new String ("My favorite book is \"Twilight\" by Stephanie Meyer");
       System.out.println(myFavoriteBook);
   }
}
\ を使用して2 つの「内部」引用符をエスケープしました。main()メソッドを実行してみましょう... コンソール出力:
My favorite book is "Twilight" by Stephanie Meyer
素晴らしい!コードはまさに私たちが望んでいたとおりに機能しました。エスケープする必要がある文字は引用符だけではありません。自分の仕事について誰かに伝えたいとします。

public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("My work files are in D:\Work Projects\java");
       System.out.println(workFiles);
   }
}
またエラーが発生しました!その理由はわかりますか? もう一度言いますが、コンパイラは何をすべきか理解できません。結局のところ、コンパイラは\ を制御シーケンス以外のものとして認識しません。バックスラッシュの後には、特別な方法 (引用符など) で解釈する必要がある特定の文字が続くことが期待されます。ただし、この場合、\の後には通常の文字が続きます。そのため、コンパイラは再び混乱します。私たちは何をすべきか?前とまったく同じです。\に別の\を追加するだけです。

public class Main {

   public static void main(String[] args) {

       String workFiles= new String ("My work files are in D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}
何が得られるか見てみましょう: コンソール出力:
My work files are in D:\Work Projects\java
素晴らしい!コンパイラは、\が残りと一緒に表示される通常の文字であると即座に判断します。Java には非常に多くの制御シーケンスがあります。完全なリストは次のとおりです。
  • \t - タブ。
  • \b - バックスペース (テキスト内で 1 つ戻る、または 1 文字の削除)。
  • \n - 新しい行。
  • \r - キャリッジリターン。()
  • \f - フォーム フィード。
  • \'一重引用符。
  • \"二重引用符。
  • \\バックスラッシュ。
したがって、コンパイラーはテキスト内で\nを検出すると、これがコンソールに表示される単なる記号や文字ではなく、「新しい行に移動!」という特別なコマンドであると理解します。たとえば、これは詩の一部を表示したい場合に便利です。

public class Main {
   public static void main(String[] args) {
       String byron = new String ("She walks in beauty, like the night, \nOf cloudless climes and starry skies\nAnd all that's best of dark and bright\nMeet in her aspect and her eyes...");
       System.out.println(byron);
   }
}
得られる結果は次のとおりです。 コンソール出力:
She walks in beauty, like the night, 
Of cloudless climes and starry skies 
And all that's best of dark and bright 
Meet in her aspect and her eyes...
まさに私たちが望んでいたものです!コンパイラはエスケープ シーケンスを認識し、詩の抜粋を 4 行で出力しました。

Unicode 文字をエスケープする

エスケープ文字に関連して知っておく必要があるもう 1 つの重要なトピックは、Unicode です。Unicode は、世界中のほぼすべての書き言葉の記号を含む標準の文字エンコーディングです。言い換えれば、これはあらゆる言語のほぼすべての文字を表す特別なコードのリストです。当然のことながら、これは非常に長いリストであり、これを暗記する人はいません :) これがどこから来たのか、なぜそれが必要になったのかを知りたい場合は、この有益な記事を読んでください: https://docs.oracle.com/javase/tutorial/ i18n/text/unicode.html すべての Unicode 文字コードの形式は「u」です。+<16 進数>"。たとえば、よく知られている著作権記号は u00A9 で表されます。したがって、Java でテキストを操作するときにこの文字を使用する必要がある場合は、テキスト内でエスケープできます。たとえば、次のようにします。 CodeGym がこのレッスンの著作権を所有していることを全員に通知します。

public class Main {
   public static void main(String[] args) {
       System.out.println("\"Escaping characters\", \u00A9 2019 CodeGym");
   }
}
コンソール出力:
"Escaping characters", © 2019 CodeGym
よかった、すべてうまくいきました! しかし、特別なシンボルだけではありません。Unicode とエスケープ文字を使用して、異なる言語で同時に書かれたテキストをエンコードできます。さらに、同じ言語のいくつかの異なる方言で書かれたテキストさえあります。

public class Main {
   public static void main(String[] args) {

       System.out.println("\u004d\u0061\u006f \u005a\u0065\u0064\u006f\u006e\u0067 " + 

               "\u0028\u0054\u0072\u0061\u0064\u0069\u0074\u0069\u006f\u006e\u0061\u006c " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065\u003a \u6bdb\u6fa4\u6771\u002c " +

               "\u0053\u0069\u006d\u0070\u006c\u0069\u0066\u0069\u0065\u0064 " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065\u003a \u6bdb\u6cfd\u4e1c\u002c " +

               "\u0050\u0069\u006e\u0079\u0069\u006e\u003a \u004d\u00e1\u006f " +

               "\u005a\u00e9\u0064\u014d\u006e\u0067\u0029 \u0077\u0061\u0073 \u0061 " +

               "\u0032\u0030\u0074\u0068\u002d\u0063\u0065\u006e\u0074\u0075\u0072\u0079 " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065 " +

                "\u0073\u0074\u0061\u0074\u0065\u0073\u006d\u0061\u006e\u002c " +

               "\u0070\u006f\u006c\u0069\u0074\u0069\u0063\u0069\u0061\u006e\u002c " +

               "\u0061\u006e\u0064 \u0074\u0068\u0065 \u0063\u0068\u0069\u0065\u0066 " +

               "\u0074\u0068\u0065\u006f\u0072\u0065\u0074\u0069\u0063\u0069\u0061\u006e " +

               "\u006f\u0066 \u004d\u0061\u006f\u0069\u0073\u006d\u002e");
   }
}
コンソール出力:
Mao Zedong (Traditional Chinese: 毛澤東, Simplified Chinese: 毛泽东, Pinyin: Máo Zédōng) was a 20th-century Chinese statesman, politician, and the chief theoretician of Maoism.
この例では、文字コードを使用して、英語と、繁体字、簡体字、ラテン語 (ピンイン) の 3 種類 (!) の異なる中国語文字で構成される文字列を作成しました。以上が要約です。これで、この素晴らしいツールを仕事で使用するために文字のエスケープについて十分に理解できました:) 学んだことを強化するには、Java コースのビデオ レッスンを視聴することをお勧めします。

さらに読む:

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION