Flutter — экспорт csv, считываемый как тарабарщина в Excel

#excel #flutter

#excel #flutter

Вопрос:

У меня есть следующий код, который я использую для экспорта символов Юникода (Herbrew) в CSV, предназначенный для открытия в Excel / Google Sheets:

 String csv = const ListToCsvConverter().convert(rows);
List<int> bytes = List.from(utf8.encode(csv));
// bytes.insert(0, unicodeBomCharacterRune );
return bytes;
  

Если я экспортирую его в gmail и открываю в Google sheets, он работает нормально, но когда я открываю его с помощью Excel, он открывает его как тарабарщину.

Я хорошо знаком с этой проблемой, которую я решил в другом ENV (php, js), добавив символ спецификации в начале файла, но когда я делаю это в flutter (ie. раскомментируйте строку bytes.insert(0, unicodeBomCharacterRune ); ) Я получаю тарабарщину как в sheets, так и в Excel.

Есть идеи, как решить эту проблему?

Комментарии:

1. В общем, в Excel, если вы импортируете (например, с помощью Power Query) вместо open , вы можете указать используемый вариант языка (а также другие свойства, такие как порядок дат, текст против числа и т. Д.), Которые обычно не встречаются в файлах CSV. В моем Power Query я вижу список трех разных версий иврита, которые можно использовать, а также общий UTF8.

2. Мне нужно, чтобы значение по умолчанию open работало как есть

Ответ №1:

Вот как я это решил:

 String csv = const ListToCsvConverter().convert(rows);
List<int> bytes = List.from(utf8.encode(csv));
bytes.insert(0, 0xBF );
bytes.insert(0, 0xBB );
bytes.insert(0, 0xEF );
return bytes;
  

The UTF-8 BOM is a sequence of bytes at the start of a text stream (0xEF, 0xBB, 0xBF) that allows the reader to more reliably guess a file as being encoded in UTF-8.

ПРИМЕЧАНИЕ: я вставляю байты в обратном порядке, поскольку добавляю их в начало