2015-11-05 6 views
0

Просто посмотрите на код нижеПреобразование 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.

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

+0

java is unicode 16, а класс string не имеет символьного кода, что означает независимо от того, какой файл вы читаете, строка в java с определенными символами всегда будет unicode –

+3

Ваш код не имеет смысла. Вы берете строку UTF-16 (как Java хранит строки) и кодируют ее как поток байтов UTF-8, а затем декодируют этот поток байтов **, как будто ** он был закодирован в GB2312. Вы в конечном итоге с мусором! То, что вы, возможно, хотели сделать, - читать кодированный байтовый поток (например, из файла), кодированный UTF-8, и выдает поток байтов с кодировкой GB2312 (например, другой файл), но это не то, что вы делаете. – Andreas

ответ

0

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

как @kalpesh сказал, внутренне, это все unicode. если вы хотите ПРОЧИТАТЬ поток в определенной кодировке, а затем WRITE его к другому, вам нужно будет указать кодировку для преобразования между байтами (в потоке) и строками (в 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(); 

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

+0

Спасибо! Фактически, что я хочу сделать, это отправить запрос на интерфейс третьей части, который нуждается в параметрах с gb2312. У меня никогда не будет строки с gb2312? Как я могу достичь этого с помощью HTTP-запроса? –

+0

то, что я описываю, работает для любого потока ... здесь я использовал FileInputStream и FileOutputStream в качестве примера. он должен работать одинаково с SerlvetIn/Outputstream. Однако вы также должны знать об HTTP-стороне вещей. в любом HTTP-запросе или ответе, вы должны иметь заголовок, чтобы объявить кодировку, потому что согласно стандарту HTTP, в противном случае он будет возвращаться к iso-8859-1.那个 一般 都 用不了. 所以 还是 主动 加. Так что вы, наверное, должны это прочитать. – rmalchow

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

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

Смежные вопросы