Problem z pierwszymi znakami BOM podczas odczytu plików Unicode (UTF-8 itp.) w Javie oraz sposoby ich obsługi
Pliki tekstowe utworzone w edytorze tekstu w Windows będą miały ID BOM dodany do nagłówka pliku (pierwszy znak), jeśli zdecydujesz się zapisać je w formacie Unicode, takim jak UTF-8.
Ta identyfikacja nie jest usuwana podczas odczytu pliku w Javie, a String.trim() nie może zostać usunięty. Jeśli użyjesz readLine() do odczytania pierwszej linii i zapisania jej w Stringu, długość Stringu będzie o 1 większa niż to, co widzisz, a pierwszy znak to ten BOM.
Może to powodować pewne problemy, na przykład podczas czytania pliku ini, jeśli chcesz sprawdzić, czy pierwsza linia zaczyna się na "[", nie możesz poprawnie ocenić.
Na szczęście, gdy Java odczytuje pliki Unicode, jednolicie zmienia BOM na "\uFEFF", więc można go rozwiązać ręcznie (po ocenie, użyj substring() lub replace(), aby usunąć ten BOM):
JednakTo podejście nie jest idealneJeśli wygenerowany plik jar działa na Windowsie, problem nadal występuje. Ostatecznym obejściem jest użycie BOMInputStream udostępnionego przez apache commons io:
Czym jest BOM?
BOM = Znak Kolejności Bajtów BOM to zalecana metoda oznaczania kolejności bajtów w specyfikacji Unicode. Na przykład dla UTF-16, jeśli odbiornik otrzyma BOM FEFF, oznacza to, że strumień bajtów jest Big-Endian; Jeśli FFFE zostanie odebrane, oznacza to, że strumień bajtów jest Little-Endian. UTF-8 nie wymaga BOM do wskazywania kolejności bajtów, ale może być używany do wskazania "Jestem zakodowany UTF-8". Kodowanie UTF-8 w BOM to EF BB BF (co widać po otwarciu tekstu za pomocą UltraEdit i przełączeniu na szesnastkowe). Jeśli odbiornik otrzyma strumień bajtów zaczynający się od EF BB BF, wie, że to kodowanie UTF-8.
|