Проблема с сохранением символов в файл - PullRequest
4 голосов
/ 06 ноября 2010

Я столкнулся с проблемой сериализации и десериализации символов Юникода. Вот пример программы, которая записывает символ в файл, а затем пытается прочитать его. Письменные и прочитанные символы ( 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.

1 Ответ

6 голосов
/ 06 ноября 2010

Символ 56000 - U + DAC0 , который не является действительным юникодным символом , это высокий суррогатный символ . Они должны использоваться в паре для указания символов вне 16-битной ширины BMP .

...