Кодировка Dart / Flutter UTF-16

Мне нужно прочитать файл, который был сохранен в Java Android Studio с этим кодом

fos = context.openFileOutput(filename, Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(json);
os.close();
fos.close();

Оказывается, Java внутренне использует UTF-16 для кодирования символов. Теперь мне нужно прочитать эти файлы в Flutter SDK (с языком Dart)

file.readAsString(encoding: Latin1).then((str) => {
       print(str)
     }).catchError( (e) => {
       print(e)
});

Однако кодировка Latin1 работает некорректно. Итак, я хочу прочитать это при использовании UTF-16, но кажется, что Dart просто не имеет этой функции или, по крайней мере, не то, что я могу найти.

Utf8Codec существует, но нет ни Utf16Codec, ни Encoding.getByName("UTF-16"). Utf8, кстати, дает исключения, так что это тоже не вариант.

Итак, как я могу по-прежнему читать файлы в Dart, которые были сохранены в Android Studio Java с использованием UTF-16?


person Wouter Vandenputte    schedule 18.09.2019    source источник
comment
Основываясь на вашем другом вопросе, я бы предположил, что байты не в UTF-16, а просто имеют префикс потока объекта Java.   -  person Richard Heap    schedule 18.09.2019
comment
Возможно, вас заинтересует этот связанный вопрос: UTF- 16LE txt-файл декодируется как String в Flutter (dart)   -  person jamesdlin    schedule 19.09.2019


Ответы (2)


Используйте utf пакет.

  var bytes = await file.readAsBytes();
  var decoder = Utf16BytesToCodeUnitsDecoder(bytes); // use le variant if no BOM
  var string = String.fromCharCodes(decoder.decodeRest());
person Richard Heap    schedule 18.09.2019
comment
этот пакет больше не выпускается - person Cliff Helsel; 07.05.2020
comment
Я обнаружил, что он все еще работает. Повезло, потому что это решило большую проблему, Уф! - person Kretin; 13.08.2020
comment
пакет utf прекращен - person M.ArslanKhan; 04.10.2020

Используйте Base64. Импорт 'dart: convert'.

  var bytes = await file.readAsBytes();
  final encoded = base64.encode(bytes);
  debugPrint("onPressed " + encoded);
person M.ArslanKhan    schedule 04.10.2020
comment
Base64 не имеет ничего общего с UTF-16. - person jamesdlin; 02.06.2021