Преобразование utf8 в gb2312 в Java

Просто посмотрите на код ниже

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();
    }

распечатать ложь!!!

Я запускаю этот код под jdk7 и jdk8, и мой стиль кода IDE - utf8.

Может кто-нибудь мне помочь?

2 ответа

Решение

То, что вы ищете, это кодирование / декодирование при выводе / вводе.

как сказал @kalpesh, внутри все это в юникоде. если вы хотите ПРОЧИТАТЬ поток в определенной кодировке, а затем ЗАПИСАТЬ его в другой код, вам нужно будет указать кодировку для преобразования между байтами (в потоке) и строками (в Java), а затем между строками (в java) в байты (выходной поток) примерно так:

        InputStream is = new FileInputStream("utf8_encoded_text.txt");
        OutputStream os = new FileOutputStream("gb2312_encoded.txt");

        Reader r = new InputStreamReader(is,"utf-8");
        BufferedReader br = new BufferedReader(r);
        Writer w = new OutputStreamWriter(os, "gb2312");
        BufferedWriter bw = new BufferedWriter(w);

        String s=null;
        while((s=br.readLine())!=null) {
            bw.write(s);
        }
        br.close();
        bw.close();
        os.flush();

Конечно, вы все равно должны сделать правильную обработку исключений, чтобы убедиться, что все правильно закрыто.

        String gb2312 = new String(str.getBytes("utf-8"), "gb2312");

Это утверждение неверно, потому что конструктор String должен принимать совпадающий байтовый массив и кодировку, вы говорите, что байты - это utf-8, а кодировка - это gb2312

Другие вопросы по тегам