2010-11-06 2 views
4

Я столкнулся с проблемой сериализации и десериализации юникодовых символов. Вот пример программы, которая записывает символ в файл и затем пытается его прочитать. Написанные и прочитанные символы (ch и ch2) различны. Любые предложения, почему я получаю такое поведение?Проблема с сохранением символов в файле

public class MainClass { 
    public static void main(String[] args) { 
     try { 
      File outfile = new File("test.txt"); 
      FileOutputStream fos = new FileOutputStream(outfile); 
      OutputStreamWriter writer = new OutputStreamWriter(fos, "UTF-16"); 
      FileInputStream fis = new FileInputStream(outfile); 
      InputStreamReader reader = new InputStreamReader(fis, "UTF-16"); 

      char ch = 56000; 
      System.out.println(Integer.toBinaryString(ch)); 
      writer.write(ch); 
      writer.close(); 

      char ch2 = (char) reader.read(); 
      System.out.println(Integer.toBinaryString(ch2)); 
      reader.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

UPD: Эмпирически установлено, что это происходит только для чисел из диапазона 55296-57343.

+0

Что происходит, когда вы открываете входной поток после закрытия выхода? – thejh

+0

Реорганизация строк программы не помогла, поэтому это не является причиной проблемы. – levanovd

ответ

6

Характер 56000 - U+DAC0, который не является valid unicode character, это high surrogate character. They должны использоваться в символах пары с точностью до 16 бит шириной BMP.

+0

Ничего себе, это интересно! Пожалуйста, предоставьте немного больше информации! – levanovd

+0

Я добавил несколько ссылок. – BalusC

+0

Спасибо! Не знал этого. – levanovd

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