Перейти к основному содержимому

Кодировать строку в UTF-8 в Java

· 3 мин. чтения

1. Обзор

При работе со строками в 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 неизменяемы в 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 , представленный в Java 7 , для кодирования 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-кодека

Помимо использования ядра Java, мы также можем использовать кодек Apache Commons для достижения тех же результатов.

Apache Commons Codec — это удобный пакет, содержащий простые кодировщики и декодеры для различных форматов.

Во-первых, давайте начнем с конфигурации проекта.

При использовании Maven мы должны добавить зависимость `` commons -codec к нашему pom.xml :

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>

Затем, в нашем случае, самый интересный класс — это 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.

Как всегда, образцы кода можно найти на GitHub .