Проблема с первыми символами BOM, возникающей при чтении файлов Unicode (UTF-8 и др.) в Java, и как с ними обращаться
Текстовые файлы, созданные с помощью текстового редактора в Windows, будут иметь BOM ID, добавленный в заголовок файла (первый символ), если вы решите сохранить их в формате Unicode, например, в UTF-8.
Эта идентификация не удаляется при чтении файла на Java, и String.trim() удалить нельзя. Если вы используете readLine() для чтения первой строки и храните её в строке, длина строки будет на один больше того, что вы видите, и первый символ — это этот 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.
|