Encode a String to UTF-8 in Java – 在Java中把一个字符串编码为UTF-8

最后修改: 2020年 4月 24日

中文/混合/英文(键盘快捷键:t)

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.

另外,我们可以使用StandardCharsetsJava 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