1. 概要

JavaでStringを処理する場合、特定の文字セットにエンコードする必要がある場合があります。

このチュートリアルは、文字列をUTF-8文字セットにエンコードするさまざまな方法を示す実用的なガイドです。

より技術的な詳細については、文字エンコードガイドを参照してください。

2. 問題の定義

Javaエンコーディングを紹介するために、ドイツ語のString「EntwickelnSiemitVergnü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を使用してエンコードされたこのStringは、非ASCIIü文字を理解しないため、印刷時に値「Entwickeln Sie mitVergn?gen」を提供します。

ただし、すべての英語文字を使用するASCIIエンコードの String を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. コア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を使用したエンコード

または、 Java7で導入されたStandardCharsetsクラスを使用して、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. コモンズによるエンコーディング-コーデック

コアJavaを使用する以外に、 Apache CommonsCodecを使用して同じ結果を得ることができます。

Apache Commons Codecは、さまざまな形式の単純なエンコーダーとデコーダーを含む便利なパッケージです。

まず、プロジェクトの構成から始めましょう。

Mavenを使用する場合は、commons-codec依存関係pom.xmlに追加する必要があります。

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

次に、この場合、最も興味深いクラスは StringUtils であり、Stringをエンコードするメソッドを提供します。

このクラスを使用すると、UTF-8でエンコードされたStringを取得するのは非常に簡単です。

String rawString = "Entwickeln Sie mit Vergnügen"; 
byte[] bytes = StringUtils.getBytesUtf8(rawString);
 
String utf8EncodedString = StringUtils.newStringUtf8(bytes);

assertEquals(rawString, utf8EncodedString);

6. 結論

String をUTF-8にエンコードすることは難しくありませんが、それほど直感的ではありません。 この記事では、コアJavaまたはApacheCommonsCodecを使用してそれを行う3つの方法を紹介します。

いつものように、コードサンプルはGitHubにあります。