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