1. Razões para escapar de personagens

Era uma vez, você aprendeu que para escrever uma string de caracteres no código, você precisa colocá-los entre aspas duplas. O resultado é uma string literal .

Mas o que fazemos se precisarmos de aspas dentro de uma string literal? Uma string contendo aspas — o que poderia ser mais fácil?

Digamos que queremos exibir o texto "Friends" was nominated for an "Oscar". Como você faz isso?

Código Notas
String s = ""Friends" was nominated for an "Oscar"";
Esta opção não funcionará!

O problema é que o compilador pensa que você está escrevendo um código completamente inesperado:

Código Notas
String s = ""Friends" was nominated for an "Oscar"";
Esta opção não funcionará!

Depois que o compilador encontra aspas duplas no código, ele trata o que segue como o início de uma string literal. A próxima aspa dupla indica o final da string literal.

Então, como você escreve aspas duplas dentro de um literal?


2. Personagens de fuga

Há uma maneira. É chamado de escape de caracteres . Você acabou de escrever as aspas dentro da string de texto. E antes das aspas, você adiciona o símbolo \( barra invertida ).

É assim que a string literal se parece quando escrita corretamente:

Código Notas
String s = "\"Friends\" was nominated for an \"Oscar\"";
Isso vai funcionar!

O compilador interpretará tudo corretamente e não considerará as aspas após a barra invertida como aspas normais.

Além disso, se você enviar esta string para a tela, as aspas com barra invertida serão processadas corretamente e o texto será exibido sem nenhuma barra invertida:"Friends" was nominated for an "Oscar"

Outro ponto importante. Uma aspa precedida por uma barra invertida representa um único caractere: estamos simplesmente usando uma notação elegante que não interfere na capacidade do compilador de reconhecer strings literais em nosso código. Você pode atribuir aspas a uma charvariável:

Código Notas
char c = '\"';
\"é um personagem, não dois
char c = '"';
Isso também é possível: aspas duplas dentro de aspas simples

3. Situações comuns que ocorrem ao escapar de personagens

Situações comuns que envolvem a fuga de personagens

Além das aspas duplas, existem muitos outros caracteres que o compilador manipula de maneira especial. Por exemplo, uma quebra de linha.

Como adicionamos uma quebra de linha a um literal? Existe também uma combinação especial para isso:

\n
caractere de quebra de linha

Se você precisar adicionar uma quebra de linha a uma string literal, basta adicionar alguns caracteres: \n.

Exemplo:

Código Saída do console
System.out.println("Best regards, \n Anonymous");
             
Best regards,
Anonymous

Há um total de 8 combinações especiais como esta, que também são chamadas de sequências de escape . Aqui estão eles:

Código Descrição
\t Inserir um caractere de tabulação
\b Inserir um caractere de backspace
\n Inserir um caractere de nova linha
\r Inserir um caractere de retorno de carro
\f Inserir um caractere de feed de página
\' Inserir uma aspa simples
\" Insira aspas duplas
\\ Inserir uma barra invertida

Você está familiarizado com dois deles, mas o que os outros 6 significam?

\té um caractere de tabulação

Quando este texto aparece no texto, é equivalente a pressionar a Tabtecla durante a digitação. Desloca o texto que o segue e permite alinhar o texto.

Exemplo:

Código Saída do 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

\bsignifica 'voltar um caractere'

Essa sequência em uma string equivale a pressionar a Backspacetecla no teclado. Ele remove o caractere que o precede:

Código Saída do console
System.out.println("Hello\b\b World");
Hell World!

\ré o caractere de retorno de carro

Este caractere move o cursor para o início da linha atual sem alterar o texto. O que quer que seja exibido a seguir substituirá a string existente.

Exemplo:

Código Saída do console
System.out.println("Greetings\r World!");
World!

\fé um caractere de feed de página

Este símbolo chegou até nós desde os dias das primeiras impressoras matriciais. A saída dessa sequência para uma impressora faria com que a impressora simplesmente alimentasse a folha atual, sem imprimir nenhum texto, até que uma nova página começasse.

Agora chamaríamos isso de quebra de página ou nova página .

\\é uma barra invertida

Tudo é direto aqui. Se usarmos uma barra invertida para escapar dos caracteres em nosso texto, como escreveremos o próprio caractere de barra invertida na string?

É simples: adicione uma barra invertida ao texto — você deve escrever duas seguidas.

Exemplo:

Código Saída do console
System.out.println("c:\projects\my\first");
O compilador gritará com você por caracteres de escape desconhecidos.
System.out.println("c:\\projects\\my\\first");
É assim que se faz certo!


4. Codificação Unicode

Como você já sabe, cada caractere exibido na tela corresponde a um código numérico específico. Um conjunto padronizado desses códigos é chamado de codificação .

Era uma vez, quando os computadores foram inventados, sete bits (menos de um byte) eram suficientes para codificar cada caractere. A primeira codificação continha apenas 128 caracteres. Essa codificação foi chamada de ASCII .

ASCII significa American Standard Code for Information Interchange — uma tabela de códigos americanos padrão para caracteres imprimíveis e alguns códigos especiais.

Ele consiste em 33 caracteres de controle não imprimíveis (que afetam como o texto e os espaços são processados) e 95 caracteres imprimíveis, incluindo números, letras latinas maiúsculas e minúsculas e vários sinais de pontuação.

Codificação Unicode

À medida que a popularidade dos computadores crescia, cada país começou a lançar sua própria codificação. Normalmente, eles tomavam o ASCII como ponto de partida e substituíam caracteres ASCII raramente usados ​​por símbolos de seus respectivos alfabetos.

Com o tempo, surgiu uma ideia: criar uma única codificação que contenha todos os caracteres de todas as codificações do mundo.

Codificação Unicode 1

Assim, em 1993, a codificação Unicode foi criada e a linguagem Java tornou-se a primeira linguagem de programação que usou essa codificação como padrão para armazenar texto. Agora o Unicode é o padrão para toda a indústria de TI.

Embora o próprio Unicode seja o padrão, ele possui várias representações ou formatos de transformação Unicode (UTF): UTF-8, UTF-16 e UTF-32, etc.

Java usa uma versão avançada da codificação Unicode — UTF-16: cada caractere é codificado em 16 bits (2 bytes). Pode acomodar até 65.536 caracteres!

Você pode encontrar quase todos os caracteres de todos os alfabetos do mundo nessa codificação. Naturalmente, ninguém memorizou tudo. Você não pode saber tudo, mas pode pesquisar tudo no Google.

Para escrever um caractere Unicode em seu programa usando seu código, você precisa escrever \u+ o código em hexadecimal . Por exemplo,\u00A9

Código Saída do console
System.out.println("\u00A9 CodeGym");
© CodeGym


5. Unicode: ponto de código

"640 kilobytes deveriam ser suficientes para todos! Ou não". (Citação atribuída a Bill Gates)

A vida é difícil e, com o tempo, a codificação UTF-16 começou a ficar inadequada. Acontece que existem muitos idiomas asiáticos e eles têm muitos glifos. E todos esses glifos simplesmente não podem ser compactados em 2 bytes.

O que pode ser feito? Use mais bytes !

Mas o tipo char tem apenas 2 bytes e alterá-lo para 4 não é tão fácil: bilhões de linhas de código Java foram escritas em todo o mundo, o que seria interrompido se o tipo char de repente se tornasse 4 bytes em uma máquina Java. Então não podemos mudar o tipo de char!

Existe outra abordagem. Lembre-se de como escapamos dos caracteres colocando uma barra invertida na frente deles. Basicamente, codificamos um único caractere usando vários caracteres.

Os criadores do Java decidiram usar a mesma abordagem.

Alguns caracteres que aparecem visualmente como um único caractere são codificados como dois chars em uma string:

Código Saída do console
System.out.println("\uD83D\uDD0A");
🔊

Agora seu programa Java pode até enviar emojis para o console 😎