StandardCharsets în Java

Constante pentru codările de text garantate în orice Java; UTF_8 este codarea potrivită pentru diacriticele românești.

Sintaxă
import java.nio.charset.StandardCharsets;

StandardCharsets.UTF_8
StandardCharsets.ISO_8859_1
StandardCharsets.US_ASCII
StandardCharsets.UTF_16

Ce face StandardCharsets

Calculatorul păstrează textul ca octeți. Codarea (charset) spune ce octeți corespund fiecărei litere. StandardCharsets are constante pentru codările care există garantat în orice Java: UTF_8, UTF_16, ISO_8859_1, US_ASCII.

StandardCharsets.UTF_8 poate reprezenta orice literă din lume și este codarea standard pe web și în Java 18+. În UTF-8, literele simple ocupă un octet, iar ă, â, î, ș, ț câte doi. Folosești constanta oriunde se cere o codare: text.getBytes(UTF_8), new String(octeti, UTF_8), Files.readString(cale, UTF_8).

Constanta este mai bună decât Charset.forName("UTF-8") sau textul "UTF-8": nu poate fi scrisă greșit și nu aruncă excepții. Dacă citești octeții cu altă codare decât cea folosită la scriere, diacriticele devin caractere ciudate.

Ce returnează

Constantele sunt obiecte Charset.

Exemple

Exemplul 1: Același text, număr diferit de octeți

import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) {
        String text = "Știință";
        System.out.println("Caractere: " + text.length());
        System.out.println("UTF-8: " + text.getBytes(StandardCharsets.UTF_8).length + " octeți");
        System.out.println("UTF-16: " + text.getBytes(StandardCharsets.UTF_16).length + " octeți");
        System.out.println("US-ASCII: " + new String(text.getBytes(StandardCharsets.US_ASCII), StandardCharsets.US_ASCII));
        System.out.println(StandardCharsets.UTF_8.name());
    }
}

Rezultat

Caractere: 7
UTF-8: 10 octeți
UTF-16: 16 octeți
US-ASCII: ?tiin??
UTF-8

Exemplul 2: Ce se întâmplă cu o codare greșită

Textul este scris în UTF-8, dar citit ca ISO-8859-1: fiecare literă cu diacritice devine două caractere ciudate.

import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) {
        byte[] octeti = "Pâine în Câmpina".getBytes(StandardCharsets.UTF_8);
        System.out.println("Corect: " + new String(octeti, StandardCharsets.UTF_8));
        System.out.println("Greșit: " + new String(octeti, StandardCharsets.ISO_8859_1));
    }
}

Rezultat

Corect: Pâine în Câmpina
Greșit: Pâine în Câmpina

Greșeli frecvente

  • Apelezi getBytes() fără codare: pe sisteme vechi rezultatul depinde de setările calculatorului.
  • Scrii "UTF8" sau "utf-8 " ca text: o greșeală de tastare aruncă UnsupportedCharsetException abia la rulare. Constanta nu are această problemă.
  • Folosești US_ASCII pentru texte românești: diacriticele devin ?.

Comenzi înrudite

  • Files.readString: Citește tot conținutul unui fișier text într-un singur String (implicit în UTF-8).
  • InputStream: Clasa de bază pentru citirea de octeți (fișiere, rețea, System.in); readAllBytes citește tot conținutul într-un byte[].
  • Base64: Transformă octeți în text sigur (litere, cifre, +, /) și înapoi; getEncoder codează, getDecoder decodează.
  • HexFormat: Transformă octeți în text hexazecimal (00–ff) și înapoi; of creează formatatorul, formatHex face conversia.