Должны ли файлы UTF-8 CSV содержать спецификацию (метку порядка байтов)?

37

Наше программное обеспечение для бизнеса позволяет пользователю сохранять определенные данные в формате CSV . Поскольку в дикой природе используется много разных форматов (все они называются «CSV»), мы пытаемся решить, как должен выглядеть «формат по умолчанию».

  • Что касается разделителей строк / полей и экранирования, существует стандарт, который мы можем использовать: RFC 4180 .

  • Что касается кодирования текста, UTF-8, похоже, появился в последнее десятилетие как «формат текстового файла по умолчанию», поэтому мы будем его использовать.

Один вопрос остается открытым: должны ли мы добавить спецификацию в начале или нет? Я прочитал множество мнений и плюсов / минусов в отношении использования спецификаций в целом, но существует ли «официальная» рекомендация или хотя бы какой-то консенсус сообщества относительно использования спецификаций в файлах CSV?

Heinzi
источник
7
Если у него есть спецификация, то это не UTF-8. Но какой формат хотят программы? Если им нужна спецификация (в основном микро-ленивец), то вам нужно добавить одну, но UTF-8 + BOM ≠ UTF-8.
Ctrl-Alt-Delor
3
Несмотря на то, что CSV, по-видимому, проще генерировать, существует так много проблем с совместимостью, особенно если вы отказываетесь от чистого 7-битного ASCII, что я очень, очень, настоятельно рекомендую вам сгенерировать настоящий XLSX, если цель состоит в том, чтобы пользователи открывали его в Excel (вместо того, чтобы повторно импортировать его в другое программное обеспечение, в этом случае вам придется указать параметры для разделителей, кодировки и т. д.). Существуют библиотеки для большинства языков, и вы сэкономите много времени вам и вашим пользователям.
jcaron
2
Если вы выберете CSV-маршрут, проверьте, что происходит при открытии файла на Mac и ПК, в идеале в нескольких версиях Excel. Также имейте в виду, что некоторые версии Excel не ведут себя одинаково, когда вы дважды щелкаете файл, чтобы открыть его или открыть файл через меню.
Jcaron
2
Почему это важно, если он открывается правильно в Excel? Ничто в этом вопросе не говорит о том, что Excel должен иметь возможность анализировать сгенерированный файл ...
rubenvb

Ответы:

55

Не для UTF-8 , но смотрите различные предостережения в комментариях.

Это не нужно (UTF-8 не имеет порядка байтов) в отличие от UTF-16/32 и не рекомендуется в стандарте Unicode . Также довольно редко можно встретить UTF-8 с BOM «в дикой природе», поэтому, если у вас нет веской причины (например, как прокомментировано, вы будете работать с программным обеспечением, ожидающим BOM), я бы порекомендовал подход без BOM ,

В Википедии упоминается в основном программное обеспечение Microsoft, которое вынуждает и ожидает спецификацию, но если вы не работаете с ними, не используйте ее.

Kayaman
источник
28
Существует также широко распространенное программное обеспечение, требующее спецификации: Excel требуется спецификация, чтобы правильно идентифицировать файл CSV как UTF-8, а не как «ANSI», то есть локальный язык совместимости. (Но Excel также делает странные вещи при сохранении такого файла, поэтому мы советуем пользователям использовать наш «настоящий» экспорт в Excel вместо экспорта в CSV, если они хотят открыть файл в Excel.)
Хайнци
21
@ Heinzi Я давно узнал, что вы не можете по-настоящему выиграть, работая с CSV и Excel. Это просто паршивый CSV-ридер. Жаль, что этого ожидают обычные пользователи.
труба
9
@Voo: Требование спецификации для UTF-8, безусловно, нарушает стандарт, учитывая, что это « не требуется и не рекомендуется ».
Дедупликатор
12
@Deduplicator: системы MS-DOS и Windows имеют большую базу устаревших текстовых файлов в кодировках, отличных от UTF-8. Качественные приложения позволяют пользователю указать, как кодируется текстовый файл при его открытии, но часто включают опцию «авто». Если пользователь выбирает «UTF-8», файл UTF-8 будет открыт правильно с или без спецификации. Если пользователь выбирает «auto», некоторые файлы UTF-8, у которых нет спецификации, могут быть неверно идентифицированы как использующие другую кодировку. Я не уверен, что можно ожидать, что приложение будет работать по-другому, поскольку файлы, которые «неправильно идентифицированы», могут быть бит-за-тождественными с ...
supercat
7
@Voo: Это противоречит многим другим специфическим для формата требованиям, когда спецификация является незаконной. Например, сценарий оболочки с спецификацией перед #!недействительным. В лучшем случае спецификация в UTF-8 «разрешена, когда никакие требования к формату / приложению не исключают ее», а не «разрешена», и поэтому ее не следует использовать. Стандарты на самом деле ясно, НЕ ДОЛЖНЫ.
R ..
8

Там все еще нет широко распространенного соглашения AFAIK, хотя, конечно, UTF-8 в настоящее время является общепринятым.

Спецификация - это ужасный артефакт:

Он невидим (пространство нулевой ширины).

Некоторое программное обеспечение может сломаться в имени первого столбца, содержащего не только буквы, но и странную спецификацию впереди.

Строка заголовка может быть скопирована для строк значения, повреждающих первое значение.

Это требуется только для некоторых программ Windows для разграничения между одним из кодировок ANSI, используемых на этом локальном компьютере Windows, и UTF-8. Блокнот, Excel.

Так что печально то, что нужно поддерживать спецификацию. Может быть необязательным.

Используйте схему именования файлов (...- utf8.txt, ...- utf8bom.txt).


Во многих случаях мы могли бы использовать HTML в качестве альтернативы экспорта. Это позволяет установить кодировку в файле. Дополнительной функцией является цвет фона / переднего плана строк и ячеек. Что повышает качество экспорта.

Joop Eggen
источник
15
Будет ли форматирование «повышать качество экспорта», в значительной степени зависит от предполагаемого использования файла. CSV часто используется как простой машиночитаемый формат, и в этом случае создание синтаксического анализа HTML получателя будет большим недостатком .
IMSoP
5
Если вы выбираете схему именования, помните об аудитории. -utf8-windows.csvлучше. Почти все знают, что такое Windows в контексте компьютеров, но гораздо меньше пользователей знают, что такое знак порядка байтов.
MSalters
2
@Davislor да, если это широко распространенный известный стандарт. В противном случае будут появляться сообщения об ошибках, tschüßпоскольку они tschüßдолжны быть написаны. На StackOverflow многие ИТ-ошибки касаются кодировок. У конечных пользователей тоже будут проблемы.
Joop Eggen
3
@JoopEggen "Широко распространенный известный стандарт", в каком именно сообществе? Я занимаюсь разработкой программного обеспечения уже почти 10 лет, и я никогда не видел этого - даже в Windows, и уж точно не в Linux или OSX, где вы почти всегда имеете дело с utf-8.
Куб
1
@JustinTime да, так как даже несколько лет, но не раньше. Разработчики MS не так уж плохи (соответствие Posix, теперь поддержка UTF-8).
Joop Eggen