Olá! Nas aulas anteriores já nos familiarizamos com strings, que são representadas pela classe em Java
String
. Como você provavelmente se lembra, uma string é uma sequência de caracteres. Os símbolos podem ser qualquer coisa - letras, números, sinais de pontuação e assim por diante. O principal é que ao criar uma string, toda a sequência seja colocada entre aspas:
public class Main {
public static void main(String[] args) {
String sasha = new String ("Меня зовут Саша, мне 20 лет!");
}
}
Mas o que acontece se precisarmos criar uma string que também contenha aspas? Por exemplo, queremos contar ao mundo sobre o nosso livro favorito:
public class Main {
public static void main(String[] args) {
String myFavoriteBook = new String ("Моя любимая книга - "Сумерки" Стефани Майер");
}
}
O compilador parece estar insatisfeito com alguma coisa! Qual você acha que poderia ser o motivo do erro e por que ele ocorreu especificamente com aspas? O fato é que o compilador percebe aspas de uma forma estritamente definida, ou seja, envolve uma string nelas. E toda vez que ele vê um caractere "
, ele espera que o mesmo caractere siga para ele, e entre eles estará o texto da linha que ele, o compilador, deve criar. No nosso caso, as aspas ao redor da palavra “Crepúsculo” estão dentro de outras aspas . E quando o compilador chega a esse trecho de texto, ele simplesmente não entende o que quer dele. Parece que há uma citação, o que significa que deve criar uma string. Mas ele já está fazendo isso! Esta é precisamente a razão. Simplificando, neste ponto o compilador não entende o que deseja dele. "Outra citação? Isso é algum tipo de erro? Já estou criando uma string! Ou devo criar outra? Uhhh...:/" Precisamos explicar ao compilador quando uma citação é um comando para ela (" crie uma string!"), e quando for um símbolo simples (“exiba a palavra “Crepúsculo” junto com aspas!”). Para conseguir isso, Java usa escape de caracteres . Isso é feito usando um caractere especial. Assim: \
. Na vida comum, é chamada de "barra invertida", mas em Java (em combinação com o caractere a ser escapado) é chamada de sequência de escape . Por exemplo, \"
aqui está - uma sequência de controle para exibir cotações na tela. Tendo encontrado tal construção dentro do seu código, o compilador entenderá que se trata apenas de um caractere de “aspas” que precisa ser exibido na tela. Vamos tentar alterar nosso código com o livro:
public static void main(String[] args) {
String myFavoriteBook = new String ("Моя любимая книга - \"Сумерки\" Стефани Майер");
System.out.println(myFavoriteBook);
}
}
Escapamos das duas aspas "internas" com um \
. Vamos tentar executar o método main()
... Saída do console:
Моя любимая книга - "Сумерки" Стефани Майер
Ótimo, o código funcionou exatamente conforme necessário! As aspas estão longe de ser o único caso em que podemos precisar de escape de caracteres. Por exemplo, queríamos contar a alguém sobre nosso trabalho:
public class Main {
public static void main(String[] args) {
String workFiles= new String ("Мои рабочие файлы лежат в папке D:\Work Projects\java");
System.out.println(workFiles);
}
}
E novamente um erro! Você já consegue adivinhar qual é o motivo? O compilador novamente não entende o que fazer. Afinal, um símbolo \
para ele nada mais é do que uma sequência de controle ! Ele espera que após a barra haja algum caractere que deverá ser interpretado de alguma forma especial (por exemplo, aspas). No entanto, aqui \
seguem as letras normais. Portanto, o compilador está confuso novamente. O que fazer? Exatamente igual à última vez: basta adicionar \
mais um ao nosso \
!
public class Main {
public static void main(String[] args) {
String workFiles= new String ("Мои рабочие файлы лежат в папке D:\\Work Projects\\java");
System.out.println(workFiles);
}
}
Vamos ver o que resulta disso: Saída do console:
Мои рабочие файлы лежат в папке D:\Work Projects\java
Super! O compilador determinou instantaneamente que esses \
eram caracteres comuns que precisavam ser enviados para o console junto com o resto. Existem algumas sequências de escape em Java. Aqui está a lista completa:
\t
caractere de tabulação.\b
um caractere de retorno no texto um passo atrás ou exclusão de um caractere em uma linha (backspace).\n
caractere de nova linha.\r
caractere de retorno de carro.\f
execução da página.\'
caractere de aspas simples.\"
caractere de aspas duplas.\\
caractere de barra invertida (\).
\n
, ele entenderá que não se trata apenas de um símbolo e de uma letra que precisa ser enviado ao console, mas de um comando especial para ele - “faça uma quebra de linha!” Por exemplo, isso pode ser útil para nós se quisermos enviar um trecho de um poema para o console:
public class Main {
public static void main(String[] args) {
String borodino = new String ("Скажи-ка, дядя, \nВедь не даром \nМосква, спаленная пожаром, \nФранцузу отдана?");
System.out.println(borodino);
}
}
E foi isso que obtivemos: Saída do console:
Скажи-ка, дядя,
Ведь не даром
Москва, спаленная пожаром,
Французу отдана?
Exatamente o que é necessário! O compilador reconheceu a sequência de escape e produziu um trecho de verso em 4 linhas.
Unicode
Outro tópico importante que você precisa conhecer em relação ao escape de caracteres é Unicode . Unicode é um padrão de codificação de caracteres que inclui caracteres de quase todos os idiomas escritos do mundo. Em outras palavras, esta é uma lista de códigos especiais, na qual existe um código para quase todos os caracteres de qualquer idioma! Naturalmente, esta lista é muito grande e ninguém a memoriza :) Se você estiver interessado em saber de onde veio e por que foi necessário, leia o artigo informativo sobre Habrahabr . Todos os códigos de caracteres em Unicode são “letrau
+ dígito hexadecimal”. Por exemplo, o famoso símbolo de copyright é indicado pelo código u00A9 . Então, se você precisar usar esse caractere ao trabalhar com texto em Java, você pode escapar dele no seu texto! Por exemplo, queremos que todos saibam que esta palestra é protegida por direitos autorais do JavaRush:
public class Main {
public static void main(String[] args) {
System.out.println("Лекция \"Экранирование символов\", \u00A9 2018 Javarush");
}
}
Saída do console:
Лекция "Экранирование символов", © 2018 Javarush
Ótimo, deu tudo certo! Mas personagens especiais não são tudo! Usando Unicode e escape de caracteres, você pode codificar texto escrito em diferentes idiomas ao mesmo tempo. E até em vários dialetos diferentes da mesma língua!
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");
}
}
Saída do console:
Ма́о Цзэду́н (кит. трад. 毛澤東, упр. 毛泽东, пиньинь: Máo Zédōng) — китайский государственный и политический деятель XX века, главный теоретик маоизма.
Neste exemplo, conhecendo os códigos dos caracteres, escrevemos uma string composta pelo alfabeto cirílico e três (!) tipos diferentes de escrita de caracteres chineses - clássico, simplificado e latino (pinyin). É basicamente isso! Agora você sabe o suficiente sobre escape de caracteres para usar esta ferramenta em seu trabalho :) Se tudo não estiver totalmente claro, aconselho você a ler este artigo : será uma boa adição.
GO TO FULL VERSION