Чтение и запись текстовых файлов с кодировкой 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();