web-dev-qa-db-ja.com

文字列をUTF-8にエンコードする

私は "ñ"文字を含む文字列を持っていますが、それにはいくつか問題があります。この文字列をUTF-8エンコーディングにエンコードする必要があります。私はこの方法でそれを試してみましたが、うまくいきません。

byte ptext[] = myString.getBytes();
String value = new String(ptext, "UTF-8");

どうやってその文字列をutf-8にエンコードするのですか?

161
Alex

JavaのStringオブジェクトは、変更できないUTF-16エンコーディングを使用します。

異なるエンコーディングを持つことができる唯一のものはbyte[]です。あなたがUTF-8データを必要とするのであれば、あなたはbyte[]が必要です。予期しないデータを含むStringがある場合、問題は初期の段階でバイナリデータを誤ってStringに変換していたことです(つまり、間違ったエンコードを使用していました)。

126
Joachim Sauer

使い方はどうですか

ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(myString)
160
Amir Rachum

byte[] ptext = String.getBytes("UTF-8");の代わりにgetBytes()を使用してください。 getBytes()はいわゆる "デフォルトエンコーディング"を使用します。これはUTF-8ではないかもしれません。

66

Java 7では、次のものを使用できます。

import static Java.nio.charset.StandardCharsets.*;

byte[] ptext = myString.getBytes(ISO_8859_1); 
String value = new String(ptext, UTF_8); 

これは、getBytes(String)よりもthrows UnsupportedEncodingExceptionを宣言しないという利点があります。

古いバージョンのJavaを使用している場合は、文字セット定数を自分で宣言できます。

import Java.nio.charset.Charset;

public class StandardCharsets {
    public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
    public static final Charset UTF_8 = Charset.forName("UTF-8");
    //....
}
63
rzymek

Java Stringは内部的には常にUTF-16でエンコードされていますが、実際には次のように考える必要があります。エンコードはStringとバイトの間の変換を行う方法です。

あなたがエンコーディングの問題を抱えているのであれば、あなたがStringを持っている頃には、それは修正するには遅すぎます。ファイル、DB、またはネットワーク接続からその文字列を作成する場所を修正する必要があります。

31

あなたはこのように試すことができます。

byte ptext[] = myString.getBytes("ISO-8859-1"); 
String value = new String(ptext, "UTF-8"); 
22
user716840
String value = new String(myString.getBytes("UTF-8"));

そして、あなたがエンコードされた "ISO-8859-1"でテキストファイルから読みたいならば:

String line;
String f = "C:\\MyPath\\MyFile.txt";
try {
    BufferedReader br = Files.newBufferedReader(Paths.get(f), Charset.forName("ISO-8859-1"));
    while ((line = br.readLine()) != null) {
        System.out.println(new String(line.getBytes("UTF-8")));
    }
} catch (IOException ex) {
    //...
}
8
fedesanp

一瞬で私はこの問題を経験し、次のようにしてそれを解決することができました

最初にインポートする必要があります

import Java.nio.charset.Charset;

それから私はUTF-8ISO-8859-1を使うために定数を宣言しなければなりませんでした

private static final Charset UTF_8 = Charset.forName("UTF-8");
private static final Charset ISO = Charset.forName("ISO-8859-1");

それから私はそれを次のように使うことができます:

String textwithaccent="Thís ís a text with accent";
String textwithletter="Ñandú";

text1 = new String(textwithaccent.getBytes(ISO), UTF_8);
text2 = new String(textwithletter.getBytes(ISO),UTF_8);
4
Quimbo

エンコード形式を指定して特殊文字をエンコードするために、以下のコードを使用しました。

String text = "This is an example é";
byte[] byteText = text.getBytes(Charset.forName("UTF-8"));
//To get original string from byte.
String originalString= new String(byteText , "UTF-8");
3
laxman954

これで私の問題は解決しました

    String inputText = "some text with escaped chars"
    InputStream is = new ByteArrayInputStream(inputText.getBytes("UTF-8"));
0
Prasanth RJ