Чтение и запись текстовых файлов с кодировкой UTF-16LE и Apache Commons IO

Я написал приложение на Java и продублировал его на C#. Приложение читает и записывает текстовые файлы с данными, разделенными табуляцией, для использования программным обеспечением HMI. Программное обеспечение HMI требует кодирования UTF или ANSI для правильного отображения символа степени, или я бы просто использовал ASCII, который, кажется, работает нормально. Приложение C# может открывать файлы, сохраненные любым без проблем. Приложение Java прекрасно читает файлы, которые оно сохранило, но при чтении файлов, сохраненных в C#, возникает небольшая проблема. Он генерирует исключение числа-формата при разборе первого символа в файле на и int. Этот символ всегда "1". Я открыл оба файла с помощью editpadlight, и они кажутся идентичными даже при просмотре с кодировкой, а кодировка - UTF-16LE. Я ломаю голову над этим, любая помощь будет оценена.

lines = FileUtils.readLines(file, "UTF-16LE");

Integer.parseInt(line[0])

Я не вижу никакой разницы между файлом, сохраненным в C#, и файлом, сохраненным в Java

Снимок экрана данных в EditPad Lite

        if(lines.get(0).split("\\t")[0].length() == 2){
        lines.set(0, lines.get(0).substring(1));
    }

2 ответа

Решение

Ваш код.NET, вероятно, пишет спецификацию. Совместимые читатели Unicode удаляют любую спецификацию, так как это метаданные, а не часть текстовых данных.

Ваш Java-код явно указывает порядок байтов

FileUtils.readLines(file, "UTF-16LE"); 

Это что-то вроде Catch-22; Если у источника есть спецификация, вы можете прочитать ее как "UTF-16". Если это не так, вы можете прочитать его как "UTF-16LE" или "UTF-16BE", поскольку вы знаете, что это такое.

Итак, либо запишите его с помощью спецификации, и прочитайте его без указания порядка байтов, либо запишите его без спецификации и прочитайте его, указав порядок байтов.

С спецификацией:

[C#]

File.WriteAllLines(file, lines, Encoding.Unicode);

[Джава]

FileUtils.readLines(file, "UTF-16"); 

Без спецификации:

[C#]

File.WriteAllLines(file, lines, new UnicodeEncoding(false));

[Джава]

FileUtils.readLines(file, "UTF-16LE"); 

В моем java-коде я обычно читаю файл, я просто указал кодировку char в InputStreamReader

          File file = new File(fileName);
    InputStreamReader fis = new InputStreamReader(new FileInputStream(file), "UTF-16LE");

    br = new BufferedReader(fis);

    String line = br.readLine();
Другие вопросы по тегам