こんにちは!これまでの講義で、Java のクラスによって表現される文字列についてはすでに理解しました
String
。おそらく覚えていると思いますが、文字列は一連の文字です。記号には、文字、数字、句読点など、あらゆるものを使用できます。重要なことは、文字列を作成するとき、シーケンス全体が引用符で囲まれていることです。
public class Main {
public static void main(String[] args) {
String sasha = new String ("Меня зовут Саша, мне 20 лет!");
}
}
しかし、中に引用符が含まれる文字列を作成する必要がある場合はどうなるでしょうか? たとえば、私たちのお気に入りの本について世界に伝えたいとします。
public class Main {
public static void main(String[] args) {
String myFavoriteBook = new String ("Моя любимая книга - "Сумерки" Стефани Майер");
}
}
コンパイラは何かに不満があるようです。エラーの原因は何だと思いますか?また、特に引用符でエラーが発生したのはなぜですか? 実際のところ、コンパイラは厳密に定義された方法で引用符を認識します。つまり、引用符で文字列をラップします。そして、彼は文字を見るたびに"
、同じ文字がそれに続くことを期待し、それらの間にはコンパイラである彼が作成しなければならない行のテキストが存在することになります。この例では、「Twilight」という単語を囲む引用符が他の引用符の内側にあります。そして、コンパイラーがこのテキスト部分に到達したとき、コンパイラーはそこから何を求めているのか理解できません。引用符があるようです。つまり、文字列を作成する必要があります。しかし、彼はすでにそれを実行しています!まさにこれが理由です。簡単に言うと、この時点でコンパイラはコンパイラが何を望んでいるのかを誤解しています。 「別の引用符ですか? これは何らかのエラーですか? すでに文字列を作成しています! それとも別の文字列を作成する必要がありますか? うーん...:/」 引用符がそれに対するコマンドである場合、コンパイラーに説明する必要があります ("文字列を作成します!」)、およびそれが単純な記号の場合 (「"Twilight" という単語を引用符で囲んで表示します!」)。これを実現するために、Java は文字エスケープを使用します。これは特殊文字を使用して行われます。このような:\
。通常、これは「バックスラッシュ」と呼ばれますが、Java では (エスケープされる文字と組み合わせて)エスケープ シーケンスと呼ばれます。たとえば、\"
これは画面上に引用符を表示するための制御シーケンスです。コード内でこのような構造に遭遇すると、コンパイラーはこれが画面に表示する必要がある単なる「引用符」文字であることを理解します。この本を使ってコードを変更してみましょう。
public static void main(String[] args) {
String myFavoriteBook = new String ("Моя любимая книга - \"Сумерки\" Стефани Майер");
System.out.println(myFavoriteBook);
}
}
2 つの「内部」引用符を . でエスケープしました\
。メソッドを実行してみますmain()
...コンソール出力:
Моя любимая книга - "Сумерки" Стефани Майер
素晴らしいです。コードは必要なとおりに機能しました。文字エスケープが必要となるケースは引用符だけではありません。たとえば、私たちは自分の仕事について誰かに話したいと考えています。
public class Main {
public static void main(String[] args) {
String workFiles= new String ("Мои рабочие файлы лежат в папке D:\Work Projects\java");
System.out.println(workFiles);
}
}
そしてまたミス!理由は何かもう推測できますか? コンパイラは再び何をすべきかを理解できません。結局のところ、彼にとってのシンボルは制御シーケンス\
にすぎません。スラッシュの後には、何らかの特別な方法で解釈する必要がある文字 (引用符など) が存在することが想定されます。ただし、ここでは通常の文字が続きます。そのため、コンパイラは再び混乱します。何をするか?前回とまったく同じです。もう 1 つ追加するだけです。 \
\
\
public class Main {
public static void main(String[] args) {
String workFiles= new String ("Мои рабочие файлы лежат в папке D:\\Work Projects\\java");
System.out.println(workFiles);
}
}
ここから何がわかるか見てみましょう: コンソール出力:
Мои рабочие файлы лежат в папке D:\Work Projects\java
素晴らしい!コンパイラは、これらが\
残りのシンボルとともにコンソールに出力する必要がある通常のシンボルであると即座に判断しました。Java にはかなりの数のエスケープ シーケンスがあります。完全なリストは次のとおりです。
\t
タブ文字。\b
テキスト内の改行文字を 1 つ戻すか、行内の 1 文字を削除します (バックスペース)。\n
改行文字。\r
キャリッジリターン文字。\f
ページ実行。\'
一重引用符文字。\"
二重引用符文字。\\
バックスラッシュ文字 (\)。
\n
、これはコンソールに出力する必要がある単なる記号や文字ではなく、そのための特別なコマンドである「改行してください!」であることを理解します。たとえば、詩の一部をコンソールに出力したい場合、これは便利かもしれません。
public class Main {
public static void main(String[] args) {
String borodino = new String ("Скажи-ка, дядя, \nВедь не даром \nМосква, спаленная пожаром, \nФранцузу отдана?");
System.out.println(borodino);
}
}
そして、これが得られたものです: コンソール出力:
Скажи-ка, дядя,
Ведь не даром
Москва, спаленная пожаром,
Французу отдана?
まさに必要なものです!コンパイラはエスケープ シーケンスを認識し、詩の一部を 4 行で出力しました。
ユニコード
文字エスケープに関連して知っておく必要があるもう 1 つの重要なトピックは、Unicodeです。 Unicode は、世界中のほぼすべての書き言葉の文字を含む文字エンコード標準です。言い換えれば、これは特別なコードのリストであり、どの言語のほぼすべての文字にも対応するコードが含まれています。当然のことながら、このリストは非常に膨大であり、これを暗記する人は誰もいません :) このリストがどこから来たのか、そしてなぜそれが必要なのかに興味がある場合は、Habrahabrに関する有益な記事を読んでください。Unicode の文字コードはすべて「文字u
+ 16 進数」です。たとえば、有名な著作権記号はコードu00A9で示されます。したがって、Java でテキストを操作するときにこの文字を使用する必要がある場合は、テキスト内でエスケープできます。たとえば、この講義は JavaRush によって著作権で保護されていることを皆さんにお知らせしたいと思います。
public class Main {
public static void main(String[] args) {
System.out.println("Лекция \"Экранирование символов\", \u00A9 2018 Javarush");
}
}
コンソール出力:
Лекция "Экранирование символов", © 2018 Javarush
よかった、すべてうまくいきました! しかし、特殊文字だけがすべてではありません。Unicode と文字エスケープを使用すると、異なる言語で書かれたテキストを同時にエンコードできます。さらには、同じ言語でもいくつかの異なる方言が存在します。
public class Main {
public static void main(String[] args) {
System.out.println("\u041c\u0430\u0301\u043e " +
"\u0426\u0437\u044d\u0434\u0443\u0301\u043d " +
"\u0028\u043a\u0438\u0442\u002e \u0442\u0440\u0430\u0434\u002e " +
"\u6bdb\u6fa4\u6771\u002c \u0443\u043f\u0440\u002e " +
"\u6bdb\u6cfd\u4e1c\u002c \u043f\u0438\u043d\u044c\u0438\u043d\u044c\u003a " +
"\u004d\u00e1\u006f \u005a\u00e9\u0064\u014d\u006e\u0067\u0029 " +
"\u2014 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 " +
"\u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 " +
"\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 " +
"\u0434\u0435\u044f\u0442\u0435\u043b\u044c \u0058\u0058 \u0432\u0435\u043a\u0430\u002c " +
"\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u043a " +
"\u043c\u0430\u043e\u0438\u0437\u043c\u0430\u002e");
}
}
コンソール出力:
Ма́о Цзэду́н (кит. трад. 毛澤東, упр. 毛泽东, пиньинь: Máo Zédōng) — китайский государственный и политический деятель XX века, главный теоретик маоизма.
この例では、文字コードがわかっているので、キリル文字と 3 種類 (!) の異なる漢字 (古典文字、簡体字、ラテン文字 (ピンイン)) で構成される文字列を書きました。基本的にはそれだけです!これで、このツールを仕事で使用するために文字エスケープについて十分に理解できました :) すべてが完全に明確でない場合は、この記事を読むことをお勧めします。追加として役立ちます。
GO TO FULL VERSION