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.