String.getBytes în Java

Transformă textul în octeți într-o codificare (UTF-8, ISO-8859-1...); encodedLength dă doar numărul de octeți.

Sintaxă
byte[] getBytes(Charset charset)   // Java 6
byte[] getBytes(String numeCharset)
byte[] getBytes()
int encodedLength(Charset charset)   // Java 27

Ce face String.getBytes

Calculatoarele stochează și trimit text ca octeți. getBytes(charset) codifică șirul în octeți după regula dată: în UTF-8, literele englezești ocupă un octet, iar ă, ș, ț ocupă câte doi; un emoji ocupă patru. Folosește constantele din StandardCharsets (UTF_8, ISO_8859_1, US_ASCII).

getBytes() fără argument folosește codificarea implicită (UTF-8 din Java 18); e mai sigur să dai codificarea explicit. Caracterele care nu există în codificare devin ?. Operația inversă este new String(octeti, StandardCharsets.UTF_8).

encodedLength(charset) (Java 27) returnează direct câți octeți ar avea textul codificat, fără să creeze array-ul. E utilă pentru limite de dimensiune (o coloană din baza de date, un mesaj de rețea).

Parametri

Parametru Descriere
charset Codificarea: de exemplu StandardCharsets.UTF_8.

Ce returnează

getBytes: un byte[] nou. encodedLength: numărul de octeți (int).

Exemple

Exemplul 1: Caractere vs octeți

import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) {
        String[] texte = {"Iasi", "Iași", "Țară", "Bravo 👍"};
        for (String t : texte) {
            System.out.println(t + ": " + t.length() + " caractere, "
                    + t.getBytes(StandardCharsets.UTF_8).length + " octeți UTF-8, "
                    + t.encodedLength(StandardCharsets.UTF_8) + " (encodedLength)");
        }
    }
}

Rezultat

Iasi: 4 caractere, 4 octeți UTF-8, 4 (encodedLength)
Iași: 4 caractere, 5 octeți UTF-8, 5 (encodedLength)
Țară: 4 caractere, 6 octeți UTF-8, 6 (encodedLength)
Bravo 👍: 8 caractere, 10 octeți UTF-8, 10 (encodedLength)

Exemplul 2: Octeții unui cuvânt și drumul înapoi

ș devine doi octeți în UTF-8. În ISO-8859-1 nu există, deci devine ?.

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

public class Main {
    public static void main(String[] args) {
        String oras = "Iași";
        byte[] utf8 = oras.getBytes(StandardCharsets.UTF_8);
        System.out.println(Arrays.toString(utf8));
        System.out.println(new String(utf8, StandardCharsets.UTF_8));
        byte[] latin1 = oras.getBytes(StandardCharsets.ISO_8859_1);
        System.out.println(new String(latin1, StandardCharsets.ISO_8859_1));
    }
}

Rezultat

[73, 97, -56, -103, 105]
Iași
Ia?i

Greșeli frecvente

  • Crezi că length() este dimensiunea în octeți. Pentru text cu diacritice, UTF-8 are mai mulți octeți decât caractere.
  • Decodifici octeții cu altă codificare decât cea folosită la codificare și obții caractere ciudate (IaÈ™i). Folosește aceeași codificare în ambele sensuri.

Comenzi înrudite

  • String.toCharArray: toCharArray() copiază șirul într-un array nou de char; getChars() copiază o porțiune într-un array existent.
  • String.length: length() dă numărul de caractere; isEmpty() verifică dacă șirul e gol, isBlank() dacă are doar spații.
  • String.codePointAt: Lucrează cu puncte de cod Unicode întregi (inclusiv emoji), nu cu valori char: citire, numărare, deplasare.