1
resposta

UTF-16

Olá,

Estou com uma dúvida, porque a saída do caractere "ç" tem 4 bytes, se o encoding UTF-16 tem 16 bits(2 bytes) ?

package br.com.alura.java.io.teste;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class TesteUnicodeEEncoding {

    public static void main(String[] args) throws Exception {

    String caractere = "ç";
    System.out.println(caractere.codePointAt(0));

    Charset charset = Charset.defaultCharset();
    System.out.println(charset.displayName());

    byte[] bytes = caractere.getBytes("windows-1252");
    System.out.print(bytes.length + ", windows-1252 ");
    String novaString = new String(bytes, "windows-1252");
    System.out.println(novaString);
    System.out.println("Conteúdo do Array " + Arrays.toString(bytes));

    bytes = caractere.getBytes("UTF-16");
    System.out.print(bytes.length + ", UTF-16 ");
    novaString = new String(bytes, "UTF-16");
    System.out.println(novaString);
    System.out.println("Conteúdo do Array " + Arrays.toString(bytes));

    bytes = caractere.getBytes(StandardCharsets.US_ASCII);
    System.out.print(bytes.length + ", US_ASCII ");
    novaString = new String(bytes, "US-ASCII");
    System.out.println(novaString);
    System.out.println("Conteúdo do Array " + Arrays.toString(bytes));

    }

}
Saída:
231
UTF-8
1, windows-1252 ç
Conteúdo do Array [-25]
4, UTF-16 ç
Conteúdo do Array [-2, -1, 0, -25]
1, US_ASCII ?
Conteúdo do Array [63]
1 resposta

Oi Paulo,

O tamanho em bytes depende do caractere, seguindo a seguinte regra para UTF-8 e UTF-16:

UTF-8:

  • 1 byte: ASCII padrão
  • 2 bytes: árabe, hebraico, a maioria dos scripts europeus
  • 3 bytes: BMP
  • 4 bytes: todos os caracteres Unicode

UTF-16:

  • 2 bytes: BMP
  • 4 bytes: todos os caracteres Unicode

No caso do ç são 4 bytes então.

Bons estudos!