Парни, у меня тут какой-то феерический майндфак.
Есть такая читалка, CoolReader называется. В ней есть закладки и даже экспорт оных в файл.
В коде написано, что файл в UTF-8, но при этом в него пишется BOM для UTF-16 (0xfeff то есть, вместо положенного 0xefbbbf): http://sourceforge.net/p/crengine/crengine/ci/cr3-3.1.2-33/tree/android/src/org/coolreader/crengine/BookInfo.java#l240 (ссылка на код той версии, что собран и работает у меня на Nook).
По факту в файле BOM правильный, двухбайтовый. WTF?
Ты пишешь в поток символ BOM, U+FEFF, и в зависимости от формата выходного файла он, как и все прочие символы, будет храниться в big endian, little endian или UTF-8.
@minoru Дело не в том, что в два байта не помещается, а в том, что символы, которые в поток пишутся — абстрактный Юникод (который в строке может храниться и как пара двухбайтных суррогатных символов, что при правильной работе со строками тебя волновать не должно), а вот бинарное представление их при записи в файл задаётся параметром в предыдущем вызове.