Создать файл с кодировкой UTF-16LE - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь создать отдельную вкладку CSV через kotlin. Для требования нам нужно иметь UTF-16LE для создаваемой кодировки файлов.

Мой урезанный код выглядит примерно так:

import java.io.File
import java.io.FileOutputStream
import java.io.OutputStreamWriter

fun main(args: Array<String>) {
    val fileOutputStream = FileOutputStream(File("bla.csv"))
    val writer = OutputStreamWriter(fileOutputStream, Charsets.UTF_16LE)
    writer.write("bla\tbla\tbla")
    writer.write("\n")
    writer.write("lab\tlab\tlab")
    writer.flush()
    writer.close()
}

Таким образом, после выполнения этой программы сгенерированный файл имеет следующую информацию: (Я запускаю файл на самом файле)

file -I bla.csv 
bla.csv: application/octet-stream; charset=binary

Это то, что я получаю, когда иду на

Charsets.UTF_16LE

Я пытался использовать другой вариант UTF-16, что еще больше запутало меня!

Так что, если я использую Charsets.UTF_16, это приведет к:

file -I bla.csv 
bla.csv: text/plain; charset=utf-16be

И если я использую Charsets.UTF_16BE, это приведет к:

file -I bla.csv 
bla.csv: application/octet-stream; charset=binary

Так что после долгих сомнений в себе и уверенности в том, что я что-то делаю неправильно, я сдался и пришел сюда.

Любое руководство будет оценено. Заранее спасибо

1 Ответ

1 голос
/ 19 июня 2019

Я подозреваю, что это ограничение команды file, а не проблема с вашим кодом (что нормально *).

Если вы в качестве первого символа файла напишите метку порядка байтов (\uFEFF), то file распознает его в порядке:

> file bla.csv 
bla.csv: Little-endian UTF-16 Unicode text
> file -I bla.csv 
bla.csv: text/plain; charset=utf-16le

Однако файл должен быть полностью действительным без спецификации. Поэтому я не уверен, почему file не признает это. может быть в том, что не всегда возможно безопасно идентифицировать UTF16-LE без спецификации, хотя вы можете подумать, что такой случай (где каждый второй байт равен 0) будет безопасной ставкой!


(* Ну, всегда есть потенциальные улучшения ... Например, было бы безопаснее заключить вывод в вызове в writer.use() вместо того, чтобы закрывать файл вручную. Вы можете заключить OutputStreamWriter в BufferedWriter за эффективность. А в рабочем коде вам, конечно, понадобится некоторая обработка ошибок. Но ничего из этого не имеет отношения к вопросу!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...