1. Overview
1.概述
When dealing with Strings in Java, we sometimes need to encode them into a specific charset.
在Java中处理Strings时,我们有时需要将它们编码成一个特定的字符集。
This tutorial is a practical guide showing different ways to encode a String to the UTF-8 charset.
本教程是一个实用指南,展示了将一个字符串编码为UTF-8字符集的不同方法。
For a more technical deep-dive, see our Guide to Character Encoding.
有关更多技术方面的深入研究,请参阅我们的字符编码指南。
2. Defining the Problem
2.界定问题
To showcase the Java encoding, we’ll work with the German String “Entwickeln Sie mit Vergnügen”:
为了展示Java编码,我们将使用德语String“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);
This String encoded using US_ASCII gives us the value “Entwickeln Sie mit Vergn?gen” when printed because it doesn’t understand the non-ASCII ü character.
这个使用US_ASCII编码的String在打印时给我们的值是 “Entwickeln Sie mit Vergn?gen”,因为它不理解非ASCII的ü字符。
But when we convert an ASCII-encoded String that uses all English characters to UTF-8, we get the same string:
但当我们将一个使用所有英文字符的ASCII编码的String转换为UTF-8时,我们得到的是相同的字符串。
String englishString = "Develop with pleasure";
byte[] englishBytes = englishString.getBytes();
String asciiEncondedEnglishString = new String(englishBytes, StandardCharsets.US_ASCII);
assertEquals(asciiEncondedEnglishString, englishString);
Let’s see what happens when we use the UTF-8 encoding.
让我们看看当我们使用UTF-8编码时会发生什么。
3. Encoding With Core Java
3.用Core Java进行编码
Let’s start with the core library.
让我们从核心库开始。
Strings are immutable in Java, which means we cannot change a String character encoding. To achieve what we want, we need to copy the bytes of the String and then create a new one with the desired encoding.
Strings在Java中是不可变的,这意味着我们不能改变String的字符编码。为了达到我们的目的,我们需要复制String的字节,然后用所需的编码创建一个新的字节。
First, we get the String bytes, and then we create a new one using the retrieved bytes and the desired charset:
首先,我们获得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. Encoding With Java 7 StandardCharsets
4.用Java 7的StandardCharsets进行编码
Alternatively, we can use the StandardCharsets class introduced in Java 7 to encode the String.
另外,我们可以使用StandardCharsets类在Java 7中引入的编码String。
First, we’ll decode the String into bytes, and second, we’ll encode the String to UTF-8:
首先,我们将把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. Encoding With Commons-Codec
5.用Commons-Codec进行编码
Besides using core Java, we can alternatively use Apache Commons Codec to achieve the same results.
除了使用核心Java,我们还可以选择使用Apache Commons Codec来达到同样的效果。
Apache Commons Codec is a handy package containing simple encoders and decoders for various formats.
Apache Commons Codec是一个方便的软件包,包含各种格式的简单编码器和解码器。
First, let’s start with the project configuration.
首先,让我们从项目配置开始。
When using Maven, we have to add the commons-codec dependency to our pom.xml:
使用Maven时,我们必须将commons-codec依赖性添加到我们的pom.xml。
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>
Then, in our case, the most interesting class is StringUtils, which provides methods to encode Strings.
然后,在我们的案例中,最有趣的类是StringUtils,它提供了对Strings进行编码的方法。
Using this class, getting a UTF-8 encoded String is pretty straightforward:
使用这个类,获得一个UTF-8编码的String是非常直接的。
String rawString = "Entwickeln Sie mit Vergnügen";
byte[] bytes = StringUtils.getBytesUtf8(rawString);
String utf8EncodedString = StringUtils.newStringUtf8(bytes);
assertEquals(rawString, utf8EncodedString);
6. Conclusion
6.结语
Encoding a String into UTF-8 isn’t difficult, but it’s not that intuitive. This article presents three ways of doing it, using either core Java or Apache Commons Codec.
将一个字符串编码为UTF-8并不困难,但并不那么直观。本文介绍了三种方法,使用核心Java或Apache Commons Codec。
As always, the code samples can be found over on GitHub.
一如既往,代码样本可以在GitHub上找到over。