Isang lecture snippet na may mentor bilang bahagi ng kurso ng Codegym University. Mag-sign up para sa buong kurso.


"Greetings, Amigo. Noong unang panahon, natutunan mo na para makapagsulat ng isang string ng mga character sa code, kailangan mong ibalot ang mga ito sa double quotes."

"Oo, and that gives us a string literal . Hindi pa masyadong matagal nalaman ko ang tungkol dito."

"Sa aming propesyon, matagal na iyon. Pero hindi iyon ang punto sa ngayon. Sa halip, sabihin sa akin kung ano ang gagawin kung kailangan namin ng mga panipi sa loob ng isang literal na string?"

"Hmm... Isang string na naglalaman ng mga quote — kung ano ang mas madali. Sigurado akong may ilang paraan..."

"Oo. Sabihin nating gusto nating ipakita ang text "Friends" was nominated for an "Oscar". Paano natin ito gagawin?"

"To be honest, I have no idea. Wala akong maisip."

"Hindi ka makakahanap ng solusyon sa pamamagitan ng lohika. Hayaan mong ipakita ko lang sa iyo kung ano ang gagawin.

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

"Hindi gagana ang opsyong ito, dahil binibigyang-kahulugan ito ng compiler bilang ganap na magkakaibang code:

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

"Pagkatapos makatagpo ang compiler ng mga dobleng panipi sa code, tinatrato nito ang sumusunod bilang simula ng literal na string. Ang susunod na double quotation mark ay nagpapahiwatig ng pagtatapos ng literal na string."

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

"May paraan. Tinatawag itong escaping characters . Isusulat mo lang ang mga quotation mark sa loob ng string ng text. At bago ang mga quote, idagdag mo ang simbolong \ ( backslash ).

"Ito 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"

"Well, hindi ko sasabihin na ito ay sobrang maginhawa..."

"Ngunit ano ang maaari mong gawin, iyon ang mga patakaran. Isa pang mahalagang punto. Ang isang panipi na pinangungunahan ng isang backslash ay kumakatawan sa isang solong karakter: kami ay gumagamit lamang ng makinis na notasyon na hindi nakakasagabal sa kakayahan ng compiler na makilala ang mga literal ng 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

Mga karaniwang sitwasyon na nangyayari kapag tumatakas sa mga character

"Bukod pa sa double quotes, marami pang ibang character na pinangangasiwaan ng compiler sa espesyal na paraan. Halimbawa, isang line break.

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

\n
Linya ng character

"Kung kailangan mong magdagdag ng line break sa isang literal na string, magdagdag ka lang ng ilang character" \n.

Halimbawa:

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

"May kabuuang 8 espesyal na kumbinasyon tulad nito, na tinatawag ding mga escape sequence . Narito ang mga ito:

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

"Ipinakita mo na sa akin ang dalawa. Ano ang ibig sabihin ng iba pang 6?"

"Ipapaliwanag ko ang lahat ngayon.

\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");
Hel 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 (depende sa bersyon ng JDK). 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!ngs

\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!

"Ang paggamit ng double slash ay may katuturan. Ngunit hindi ko agad naisaulo ang lahat ng iba pa. Kailangan kong umasa sa iyong mga pahiwatig."

"Unti-unti, maaalala mo kung ano ang kailangan mo. Huwag kang mag-alala. At para sa lahat, nariyan ang Google.

Unicode encoding

"Alam mo na na ang bawat character 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 character. Ang unang pag-encode ay naglalaman lamang ng 128 character. Ang pag-encode na ito ay tinatawag na ASCII . "

"Kakaibang pangalan yan."

"Walang kakaiba tungkol dito. Ito ay isang pagdadaglat. 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 teksto 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.

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

"Sa paglipas ng panahon, isang ideya ang lumitaw: lumikha ng isang solong pag-encode na naglalaman ng lahat ng mga character ng bawat pag-encode sa mundo.

Unicode encoding

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

"Bagaman ang Unicode mismo ang pamantayan, mayroon itong ilang mga representasyon o mga format ng pagbabagong Unicode (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 character! Maaari mong mahanap ang halos bawat character ng bawat alphabet sa mundo sa encoding na ito. "

"Sana hindi ko na kailangan malaman ng puso?"

"Kung gusto mo, go for it!"

"Okay, fine. I'll use this rule: you can't know everything, but you can Google everything."

"Ang pag-ampon ng makatuwirang diskarte ay lahat. Kaya, 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

Unicode: code point

"640 kilobytes ay dapat na sapat para sa lahat! O hindi". Minsan sinabi ni Bill Gates yan. O hindi. Hindi bababa sa ang quote na ito ay naiugnay sa kanya."

"Haha. Hindi pa sapat ang 640 kilobytes para i-load ang utak ng paglilinis ng robot."

"Mahirap ang buhay, at sa paglipas ng panahon, nagsimulang maging hindi sapat ang pag-encode ng UTF-16. 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. ."

"So anong gagawin natin?"

"Gumamit ng higit pang mga byte ! Ngunit ang uri ng char ay 2 byte lamang at ang pagpapalit nito sa 4 ay hindi napakadali: bilyun-bilyong linya ng Java code ang naisulat sa buong mundo, na masisira kung ang uri ng char ay biglang naging 4 na bait sa isang Java. machine. Kaya hindi namin mababago 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. Sa pangkalahatan, 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 nakakapag-output pa ng mga emoji sa console 😎"

"Gagamitin ko talaga yan para magsaya!"