utf-8 - java utf8 转 gb2312 错误?
PHP中文网
PHP中文网 2017-04-17 15:34:05
0
3
684

直接上代码,方便同学可以复制下来跑跑


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

跪请大神赐教啊!!!!

PHP中文网
PHP中文网

认证高级PHP讲师

全員に返信(3)
阿神

Java のすべての文字列は Unicode でエンコードされています。 String.getBytes(...) を使用すると、コードの結果として、UTF8 でエンコードされたバイト配列が GB2312 に直接読み込まれます。それは間違いです。
文字列自体は統一されたエンコーディングです。特定のエンコーディングで文字列を出力する必要がある場合は、String.getBytes(...) を直接使用して、対応するエンコーディングの文字列バイト配列を取得できます。変換。

UTF8 形式の文字列バイト配列を GB2312 形式に変換する場合、コードは

である必要があります。 リーリー
いいねを押す +0
大家讲道理

文字列 gb2312 と utf8 は両方ともすでに文字化けしています。 New String(str.getBytes("utf-8"), "gb2312") は、utf-8 を使用してエンコードし、その後 gb2312 を使用してデコードすることを意味します。文字化けしました

いいねを押す +0
刘奇

質問者はエンコードとデコードについて誤解があると思われます。

getBytes(String charsetName) は、chasetName で表されるエンコード形式を使用して文字列をエンコードし、バイト配列を取得することを指します。
String(byte bytes[], String charsetName) この構築方法は、chasetName で表されるエンコード形式を使用して、直接配列をデコードして文字列を取得することを指します。

言い換えると、特定の形式でエンコードされた文字配列を取得するには、getBytes(String charsetName) を使用するだけです。バイト配列は、エンコードに使用したものと同じエンコード形式を使用してデコードする必要があります。そうしないとコードが文字化けします。このとき、すでに文字化けしている文字列を使用してエンコードを変換すると、以前に正しくエンコードされたバイト配列を取得できない可能性があります。

例:

リーリー

ここで: errorStr は "�Ϻ��Ϻ�"
もう 1 つのバイト配列は次のとおりです:

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!