Чтение и запись текстовых файлов с кодировкой UTF-16LE и Apache Commons IO - PullRequest
0 голосов
/ 04 декабря 2018

Я написал приложение на 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));
    }

1 Ответ

0 голосов
/ 05 декабря 2018

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

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

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

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

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

С помощью спецификации:

[C #]

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

[Java]

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

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

[C #]

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

[Java]

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