Кодирайте низ в UTF-8 в Java

1. Общ преглед

Когато се занимаваме със String s в Java, понякога трябва да ги кодираме в определен набор от символи.

Този урок е практическо ръководство, показващо различни начини за кодиране на низ в кодировката UTF-8 ; за по-техническо дълбоко гмуркане вижте нашето Ръководство за кодиране на символи.

2. Определяне на проблема

За да покажем кодирането на Java, ще работим с немския низ „Entwickeln Sie mit Vergnügen“.

String germanString = "Entwickeln Sie mit Vergnügen"; byte[] germanBytes = germanString.getBytes(); String asciiEncodedString = new String(germanBytes, StandardCharsets.US_ASCII); assertNotEquals(asciiEncodedString, germanString);

Този низ, кодиран с US_ASCII, ни дава стойността “Entwickeln Sie mit Vergn? Gen”, когато се отпечатва, тъй като не разбира символа ü, различен от ASCII . Но когато преобразуваме ASCII кодиран низ, който използва всички английски символи в UTF-8, получаваме същия низ.

String englishString = "Develop with pleasure"; byte[] englishBytes = englishString.getBytes(); String asciiEncondedEnglishString = new String(englishBytes, StandardCharsets.US_ASCII); assertEquals(asciiEncondedEnglishString, englishString);

Нека да видим какво се случва, когато използваме кодирането UTF-8.

3. Кодиране с Core Java

Нека започнем с основната библиотека.

String s са неизменяеми в Java, което означава, че не можем да променим кодиране на символен низ . За да постигнем това, което искаме, трябва да копираме байтовете на String и след това да създадем нов с желаното кодиране .

Първо получаваме байтовете String и след това създаваме нов, като използваме извлечените байтове и желания набор от символи:

String rawString = "Entwickeln Sie mit Vergnügen"; byte[] bytes = rawString.getBytes(StandardCharsets.UTF_8); String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8); assertEquals(rawString, utf8EncodedString);

4. Кодиране с Java 7 StandardCharsets

Като алтернатива можем да използваме класа StandardCharsets, въведен в Java 7, за кодиране на String .

Първо, ще декодираме String в байтове и, второ, ще кодираме String в UTF-8:

String rawString = "Entwickeln Sie mit Vergnügen"; ByteBuffer buffer = StandardCharsets.UTF_8.encode(rawString); String utf8EncodedString = StandardCharsets.UTF_8.decode(buffer).toString(); assertEquals(rawString, utf8EncodedString);

5. Кодиране с Commons-Codec

Освен че използваме основната Java, можем алтернативно да използваме Apache Commons Codec, за да постигнем същите резултати.

Apache Commons Codec е удобен пакет, съдържащ прости кодери и декодери за различни формати.

Първо, нека започнем с конфигурацията на проекта. Когато използваме Maven, трябва да добавим зависимостта commons-codec към нашия pom.xml :

 commons-codec commons-codec 1.14 

Тогава в нашия случай най-интересният клас е StringUtils , който предоставя методи за кодиране на String s. Използвайки този клас, получаването на кодиран низ от UTF-8 е доста лесно:

String rawString = "Entwickeln Sie mit Vergnügen"; byte[] bytes = StringUtils.getBytesUtf8(rawString); String utf8EncodedString = StringUtils.newStringUtf8(bytes); assertEquals(rawString, utf8EncodedString);

6. Заключение

Кодирането на низ в UTF-8 не е трудно, но не е толкова интуитивно. Този урок представя три начина за това, или с помощта на основната Java, или с помощта на Apache Commons Codec.

Както винаги, примерните кодове могат да бъдат намерени в GitHub.