直接上代码,方便同学可以复制下来跑跑
try {
String str = "上海上海";
String gb2312 = new String(str.getBytes("utf-8"), "gb2312");
String utf8 = new String(gb2312.getBytes("gb2312"), "utf-8");
System.out.println(str.equals(utf8));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
结果打印false
jdk7和8下面都是这结果,ide编码是utf-8
跪请大神赐教啊!!!!
Java のすべての文字列は Unicode でエンコードされています。 String.getBytes(...) を使用すると、コードの結果として、UTF8 でエンコードされたバイト配列が GB2312 に直接読み込まれます。それは間違いです。
文字列自体は統一されたエンコーディングです。特定のエンコーディングで文字列を出力する必要がある場合は、String.getBytes(...) を直接使用して、対応するエンコーディングの文字列バイト配列を取得できます。変換。
UTF8 形式の文字列バイト配列を GB2312 形式に変換する場合、コードは
である必要があります。 リーリー文字列 gb2312 と utf8 は両方ともすでに文字化けしています。 New String(str.getBytes("utf-8"), "gb2312") は、utf-8 を使用してエンコードし、その後 gb2312 を使用してデコードすることを意味します。文字化けしました
質問者はエンコードとデコードについて誤解があると思われます。
getBytes(String charsetName) は、chasetName で表されるエンコード形式を使用して文字列をエンコードし、バイト配列を取得することを指します。
String(byte bytes[], String charsetName) この構築方法は、chasetName で表されるエンコード形式を使用して、直接配列をデコードして文字列を取得することを指します。
言い換えると、特定の形式でエンコードされた文字配列を取得するには、getBytes(String charsetName) を使用するだけです。バイト配列は、エンコードに使用したものと同じエンコード形式を使用してデコードする必要があります。そうしないとコードが文字化けします。このとき、すでに文字化けしている文字列を使用してエンコードを変換すると、以前に正しくエンコードされたバイト配列を取得できない可能性があります。
例:
リーリーここで: errorStr は "�Ϻ��Ϻ�"
もう 1 つのバイト配列は次のとおりです: