2016-03-30 12 views
1

У меня есть большой набор данных, который включает в себя испанские и английские символы, которые я буферизую и передаю в файл. Первый щелчок отлично работает и записывает новый файл спецификации UTF-16BE \ w.Есть ли у Apache FileUtils возможность учета спецификаций при добавлении к файлу UTF-16?

Когда я пытаюсь добавить следующий набор данных, FileUtils.write() вызывает String.getBytes («UTF-16»), который создает другую спецификацию в начале массива байтов, которую он собирается добавить.

Есть ли способ сообщить FileUtils, чтобы определить, добавляет ли он и обрезает спецификацию, если она существует?

ответ

0

Хорошо, я думаю, что понял, что я хочу делать.

private byte[] withoutBOM(final String string, final Charset encoding) throws UnsupportedEncodingException { 
    byte[] bytes = string.getBytes(encoding); 
    return Arrays.copyOfRange(bytes, bytes.length % string.length(), bytes.length); 
} 

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

0

В Java по умолчанию кодировка «UTF-16» всегда добавляет спецификацию в начале. Однако эти два варианта «UTF-16BE» и «UTF-16LE» не написать спецификации:

из документации Charset (см «при кодировании» части):

При декодировании Кодировки UTF-16BE и UTF-16LE интерпретируют начальные байтовые байты как НЕРЕЗИДНОЕ НЕПРЕРЫВНОЕ ПРОСТРАНСТВО; при кодировании они не записывают байтовые байты.

При декодировании кодировка UTF-16 интерпретирует знак байтового порядка в начале входного потока, чтобы указать порядок байтов потока, но по умолчанию используется значение big-endian, если нет байтового байта; при кодировании он использует порядок байтов байтов и записывает знак байтового байта большого конца.

Поэтому вам просто нужно проверить существующую спецификацию и выбрать соответствующую кодировку для добавления текста UTF-16 в файл.

КСТАТИ: Для английского и французских языков UTF-8 будут достаточно и гораздо более эффективным ...

+0

Если я скажу Java использовать UTF-8, я получаю плохие символы для таких вещей, как «BALCON» – mike

+0

Если вы пишете это как UTF-8 и читать UTF-8, символ будет правильным. Только если вы напишете его как UTF-8 и прочитаете его как ANSI, у вас будут дефектные символы. Но это проблема с вашим зрителем/редактором. – Robert

+0

О, понял. Я ошибочно полагал, что UTF-8 не обрабатывал его, потому что это был только один байт, в отличие от двух байтов UTF-16. – mike