Проблема перших символів BOM, які виникають при читанні файлів Unicode (UTF-8 тощо) в Java, і як з ними працювати
Текстові файли, створені текстовим редактором у Windows, матимуть BOM ID, доданий у заголовок файлу (перший символ), якщо ви вирішите зберегти їх у форматі Unicode, наприклад UTF-8.
Ця ідентифікація не видаляється при читанні файлу в Java, і String.trim() не можна видалити. Якщо ви використовуєте readLine() для читання першого рядка і зберігаєте його в рядку, довжина рядка буде на 1 більше за те, що ви бачите, і перший символ — це цей BOM.
Це може спричинити певні труднощі, наприклад, при читанні ini-файлу, якщо ви хочете визначити, чи починається перший рядок з "[", ви не можете правильно оцінити.
На щастя, коли Java читає файли Unicode, BOM рівномірно змінюється на "\uFEFF", тож ви можете вирішити це вручну (після оцінки використайте substring() або replace() для видалення цього BOM):
Однак,Цей підхід не є ідеальнимЯкщо згенерований jar-файл працює під Windows, проблема все одно існує. Остаточним рішенням є використання BOMInputStream, наданого apache commons io:
Що таке BOM?
BOM = Мітка порядку байтів BOM — це рекомендований метод позначення порядку байтів у специфікації Unicode. Наприклад, для UTF-16, якщо приймач отримує BOM FEFF, це вказує, що потік байтів є Big-Endian; Якщо отримано FFFE, це означає, що потік байтів є Літтл-Ендіан. UTF-8 не вимагає BOM для позначення порядку байтів, але може використовуватися для позначення «Я закодований UTF-8». UTF-8 кодування BOM — це EF BB BF (як видно при відкритті тексту за допомогою UltraEdit і переходу на шістнадцятковий). Отже, якщо приймач отримує байтовий потік, що починається з EF BB BF, він знає, що це кодування UTF-8.
|