Qual codificação Java usa UTF-8 ou UTF-16?
Eu já li as seguintes postagens:
Qual é a representação interna do Java para String? UTF-8 modificado? UTF-16?https://docs.oracle.com/javase/8/docs/api/java/lang/String.htmlAgora considere o código fornecido abaixo:
public static void main(String[] args) {
printCharacterDetails("最");
}
public static void printCharacterDetails(String character){
System.out.println("Unicode Value for "+character+"="+Integer.toHexString(character.codePointAt(0)));
byte[] bytes = character.getBytes();
System.out.println("The UTF-8 Character="+character+" | Default: Number of Bytes="+bytes.length);
String stringUTF16 = new String(bytes, StandardCharsets.UTF_16);
System.out.println("The corresponding UTF-16 Character="+stringUTF16+" | UTF-16: Number of Bytes="+stringUTF16.getBytes().length);
System.out.println("----------------------------------------------------------------------------------------");
}
Quando tentei depurar a linhacharacter.getBytes()
no código acima, o depurador me levou para o diretóriogetBytes()
método da classe String e, posteriormente, no diretóriostatic byte[] encode(char[] ca, int off, int len)
método da classe StringCoding. A primeira linha do método de codificação (String csn = Charset.defaultCharset().name();
) retornou "UTF-8" como a codificação padrão durante a depuração. Eu esperava que fosse "UTF-16".
A saída do programa é:
Valor Unicode para 最 = 6700 O caractere UTF-8 = 最 | Padrão: Número de bytes = 3
O caractere UTF-16 correspondente = | UTF-16: Número de bytes = 6
Quando o converti para UTF-16 explicitamente no programa, foram necessários 6 bytes para representar o caractere. Não deveria usar 2 ou 4 bytes para UTF-16? Por que 6 bytes foram usados?
Onde estou errado no meu entendimento? Eu uso o Ubuntu 14.04 e o comando locale mostra o seguinte:
LANG=en_US.UTF-8
Isso significa que a JVM decide qual codificação usar com base no SO subjacente ou usa apenas UTF-16? Por favor me ajude a entender o conceito.