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 .