Преобразование 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