web-dev-qa-db-ja.com

Java String encoding(UTF-8)

私はこのレガシーコードの行に出くわしました。

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));

私が理解できる限りでは、同じcharSetを使用したエンコードとデコードです。

これは以下とどのように違いますか?

String newString = oldString;

2つの行の出力が異なるシナリオはありますか?

p.s .:明確にするために、はい、私は Joel Spolskyによるエンコードに関する優れた記事

18
OceanBlue

これは複雑な方法です

String newString = new String(oldString);

これにより、使用される基本的なchar []がはるかに長くなるため、文字列が短くなります。

ただし、より具体的には、すべての文字がUTF-8でエンコードできることを確認します。

文字列にはエンコードできない「文字」がいくつかあり、これらは?に変換されます

\ uD800と\ uDFFFの間の文字はエンコードできず、「?」に変換されます

String oldString = "\uD800";
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8");
System.out.println(newString.equals(oldString));

プリント

false
22
Peter Lawrey

これは以下とどのように違いますか?

コードのこの行:

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));

次のコード行では、新しいStringオブジェクト(つまりoldStringのコピー)を構築します:

String newString = oldString;

Java.lang.Stringの新しい変数を宣言し、変数oldStringと同じStringオブジェクトを参照するように初期化します。

2つの行の出力が異なるシナリオはありますか?

絶対に:

String newString = oldString;
boolean isSameInstance = newString == oldString; // isSameInstance == true

vs.

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
 // isSameInstance == false (in most cases)    
boolean isSameInstance = newString == oldString;

a_horse_with_no_name(コメントを参照)は当然です。と同等

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));

String newString = new String(oldString);

ピーター・ローリーが答えで説明しているエンコーディングに対する微妙な違いを差し引いたもの。

4
afrischke