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

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

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

Integer.parseInt(line[0])

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

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

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

person Community    schedule 04.12.2018    source источник
comment
Я смог найти решение, удалив первый символ в текстовом файле. Я не уверен, что это за символ и почему он здесь, я узнал о кодировщике символов больше, чем когда-либо хотел знать. В версии C# я использую Convert.ToInt16(), поэтому, возможно, он справляется с ошибкой Java Integer.parseInt().   -  person    schedule 05.12.2018


Ответы (1)


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

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

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

Это что-то вроде Уловки-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"); 
person Tom Blodget    schedule 05.12.2018
comment
Спасибо, Том. В С# я использовал StreamWriter и указывал Encoding.Unicode, который, как я полагаю, включает метку байта. Я перешел на новый UnicodeEncoding(false, false)) и он отлично работает - person ; 05.12.2018