1. Mga dahilan para sa pagtakas ng mga character

Noong unang panahon, natutunan mo na upang magsulat ng isang string ng mga character sa code, kailangan mong balutin ang mga ito sa double quote. Ang resulta ay literal na string .

Ngunit ano ang gagawin natin kung kailangan natin ng mga panipi sa loob ng literal na string? Isang string na naglalaman ng mga quote — ano ang mas madali?

Sabihin nating gusto nating ipakita ang text "Friends" was nominated for an "Oscar". Paano mo gagawin iyon?

Code Mga Tala
String s = ""Friends" was nominated for an "Oscar"";
Hindi gagana ang pagpipiliang ito!

Ang isyu ay iniisip ng compiler na nagsusulat ka ng ganap na hindi inaasahang code:

Code Mga Tala
String s = ""Friends" was nominated for an "Oscar"";
Hindi gagana ang pagpipiliang ito!

Matapos makatagpo ang compiler ng dobleng quote sa code, tinatrato nito ang sumusunod bilang simula ng literal na string. Ang susunod na double quotation mark ay nagpapahiwatig ng dulo ng string literal.

Kaya paano ka magsusulat ng mga dobleng panipi sa loob ng isang literal?


2. Pagtakas sa mga tauhan

May paraan. Tinatawag itong escaping characters . Isulat mo lang ang mga panipi sa loob ng string ng teksto. At bago ang mga panipi, idagdag mo ang \( backslash ) na simbolo.

Ganito ang hitsura ng literal na string kapag nakasulat nang maayos:

Code Mga Tala
String s = "\"Friends\" was nominated for an \"Oscar\"";
Ito ay gagana!

Ang compiler ay magbibigay kahulugan sa lahat ng tama at hindi isasaalang-alang ang panipi pagkatapos ng backslash bilang isang normal na panipi.

Higit pa, kung ilalabas mo ang string na ito sa screen, ang mga quote na may backslashes ay mapoproseso nang tama, at ang text ay ipapakita nang walang anumang backslashes:"Friends" was nominated for an "Oscar"

Isa pang mahalagang punto. Ang isang panipi na pinangungunahan ng backslash ay kumakatawan sa isang character: gumagamit lang kami ng slick notation na hindi nakakasagabal sa kakayahan ng compiler na makilala ang mga literal na string sa aming code. Maaari kang magtalaga ng mga quote sa isang charvariable:

Code Mga Tala
char c = '\"';
\"ay isang karakter, hindi dalawa
char c = '"';
Posible rin ito: isang double quotation mark sa loob ng single quotes

3. Mga karaniwang sitwasyon na nangyayari kapag tumatakas sa mga karakter

Mga karaniwang sitwasyon na may kinalaman sa pagtakas ng mga character

Bilang karagdagan sa mga dobleng panipi, maraming iba pang mga character na pinangangasiwaan ng compiler sa isang espesyal na paraan. Halimbawa, isang line break.

Paano tayo magdagdag ng line break sa literal? Mayroon ding isang espesyal na kumbinasyon para dito:

\n
Linya ng character

Kung kailangan mong magdagdag ng line break sa literal na string, kailangan mo lang magdagdag ng ilang character: \n.

Halimbawa:

Code Output ng console
System.out.println("Best regards, \n Anonymous");
             
Best regards,
Anonymous

Mayroong kabuuang 8 espesyal na kumbinasyon tulad nito, na tinatawag ding mga escape sequence . Nandito na sila:

Code Paglalarawan
\t Magpasok ng isang tab na character
\b Maglagay ng backspace na character
\n Maglagay ng bagong linyang karakter
\r Maglagay ng character sa pagbabalik ng karwahe
\f Maglagay ng character ng page feed
\' Maglagay ng isang panipi
\" Maglagay ng double quotation mark
\\ Maglagay ng backslash

Pamilyar ka sa dalawa sa kanila, ngunit ano ang ibig sabihin ng iba pang 6?

\tay isang tab na character

Kapag lumabas ang text na ito sa text, katumbas ito ng pagpindot sa Tabkey habang nagta-type. Inililipat nito ang tekstong kasunod nito at ginagawang posible na ihanay ang teksto.

Halimbawa:

Code Output ng console
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

\bibig sabihin ay 'bumalik ng isang karakter'

Ang sequence na ito sa isang string ay katumbas ng pagpindot sa Backspacekey sa keyboard. Tinatanggal nito ang karakter na nauuna dito:

Code Output ng console
System.out.println("Hello\b\b World");
Hell World!

\ray ang karakter sa pagbabalik ng karwahe

Inililipat ng karakter na ito ang cursor sa simula ng kasalukuyang linya nang hindi binabago ang teksto. Anuman ang susunod na ipapakita sa susunod ay papatungan ang umiiral na string.

Halimbawa:

Code Output ng console
System.out.println("Greetings\r World!");
World!

\fay isang page feed character

Ang simbolo na ito ay bumaba sa amin mula sa mga araw ng mga unang dot matrix printer. Ang pag-output ng pagkakasunud-sunod na ito sa isang printer ay magiging sanhi ng pagpapakain ng printer sa kasalukuyang sheet, nang hindi nagpi-print ng anumang teksto, hanggang sa magsimula ang isang bagong pahina.

Ngayon ay tatawagin natin itong page break o bagong page .

\\ay isang backslash

Diretso ang lahat dito. Kung gagamit tayo ng backslash para makatakas sa mga character sa ating text, paano tayo magsusulat ng backslash character mismo sa string?

Simple lang: magdagdag ng backslash sa text — kailangan mong magsulat ng dalawa sa isang hilera.

Halimbawa:

Code Output ng console
System.out.println("c:\projects\my\first");
Sisigawan ka ng compiler para sa hindi kilalang nakatakas na mga character.
System.out.println("c:\\projects\\my\\first");
Ganyan ginagawa ng tama!


4. Unicode encoding

Tulad ng alam mo na, ang bawat karakter na ipinapakita sa screen ay tumutugma sa isang partikular na numerical code. Ang isang standardized set ng mga code na ito ay tinatawag na encoding .

Noong unang panahon, kapag ang mga computer ay bagong imbento, pitong bits (mas mababa sa isang byte) ay sapat na upang i-encode ang bawat karakter. Ang unang encoding ay naglalaman lamang ng 128 character. Ang pag-encode na ito ay tinatawag na ASCII .

Ang ASCII ay nangangahulugang American Standard Code for Information Interchange — isang karaniwang American code table para sa mga napi-print na character at ilang espesyal na code.

Binubuo ito ng 33 hindi napi-print na mga control character (na nakakaapekto sa kung paano pinoproseso ang text at mga espasyo) at 95 na napi-print na mga character, kabilang ang mga numero, uppercase at lowercase na Latin na titik, at ilang mga bantas.

Unicode encoding

Habang ang mga computer ay lumago sa katanyagan, ang bawat bansa ay nagsimulang maglabas ng sarili nitong encoding. Karaniwan, kinuha nila ang ASCII bilang panimulang punto at pinalitan ang bihirang ginagamit na mga character na ASCII ng mga simbolo mula sa kani-kanilang mga alpabeto.

Sa paglipas ng panahon, lumitaw ang isang ideya: lumikha ng iisang encoding na naglalaman ng lahat ng character ng bawat encoding sa mundo.

Unicode encoding 1

Kaya, noong 1993, nilikha ang Unicode encoding, at ang wikang Java ang naging unang programming language na gumamit ng encoding na ito bilang pamantayan para sa pag-iimbak ng teksto. Ngayon ang Unicode ay ang pamantayan para sa buong industriya ng IT.

Bagama't ang Unicode mismo ang pamantayan, mayroon itong ilang representasyon o Unicode transformation formats (UTF): UTF-8, UTF-16 at UTF-32, atbp.

Gumagamit ang Java ng advanced na bersyon ng Unicode encoding — UTF-16: ang bawat character ay naka-encode sa 16 bits (2 bytes). Maaari itong tumanggap ng hanggang 65,536 na mga character!

Maaari mong mahanap ang halos bawat karakter ng bawat alpabeto sa mundo sa encoding na ito. Naturally, walang sinuman ang nakakabisado ng buong bagay. Hindi mo malalaman ang lahat, ngunit maaari mong i-google ang lahat.

Upang magsulat ng isang Unicode na character sa iyong programa gamit ang code nito, kailangan mong isulat \u+ ang code sa hexadecimal . Halimbawa,\u00A9

Code Output ng console
System.out.println("\u00A9 CodeGym");
© CodeGym


5. Unicode: code point

"640 kilobytes ay dapat na sapat para sa lahat! O hindi". (Sipi na iniuugnay kay Bill Gates)

Ang buhay ay mahirap, at sa paglipas ng panahon, ang UTF-16 encoding ay nagsimulang maging hindi sapat. Lumalabas na maraming wikang Asyano, at marami silang mga glyph. At ang lahat ng mga glyph na ito ay hindi maaaring isiksik sa 2 byte.

Ano ang maaaring gawin? Gumamit ng higit pang mga byte !

Ngunit ang uri ng char ay 2 byte lamang at ang pagpapalit nito sa 4 ay hindi ganoon kadali: bilyun-bilyong linya ng Java code ang naisulat sa buong mundo, na masisira kung ang uri ng char ay biglang naging 4 byte na isang Java machine. Kaya hindi namin maaaring baguhin ang uri ng char!

May isa pang diskarte. Tandaan kung paano namin tinatakasan ang mga character sa pamamagitan ng paglalagay ng backslash sa harap nila. Karaniwan, nag-encode kami ng isang character gamit ang maraming character.

Nagpasya ang mga tagalikha ng Java na gumamit ng parehong diskarte.

Ang ilang mga character na biswal na lumilitaw bilang isang character ay naka-encode bilang dalawang chars sa isang string:

Code Output ng console
System.out.println("\uD83D\uDD0A");
🔊

Ngayon ang iyong Java program ay makakapag-output pa ng mga emoji sa console 😎