Problém s prvými znakmi BOM pri čítaní Unicode súborov (UTF-8 a pod.) v Jave a ako s nimi pracovať
Textové súbory vytvorené textovým editorom vo Windows budú mať k hlavičke súboru pridané ID BOM (prvý znak), ak sa rozhodnete uložiť ich v Unicode formáte, napríklad UTF-8.
Táto identifikácia sa neodstráni pri čítaní súboru v Jave a String.trim() nie je možné odstrániť. Ak použijete readLine() na prečítanie prvého riadku a uloženie do reťazca, dĺžka reťazca bude o 1 väčšia než to, čo vidíte, a prvý znak je tento BOM.
To môže spôsobiť problémy, napríklad pri čítaní ini súboru, ak chcete zistiť, či prvý riadok začína na "[", neviete správne posúdiť.
Našťastie, keď Java číta Unicode súbory, jednotne mení BOM na "\uFEFF", takže to môžete vyriešiť manuálne (po vyhodnotení použite substring() alebo replace() na odstránenie tohto BOM):
Avšak,Tento prístup nie je dokonalýAk vygenerovaný jar súbor beží pod Windows, problém stále existuje. Konečným riešením je použiť BOMInputStream poskytovaný apache commons io:
Čo je BOM?
BOM = Značka usporiadania bajtov Kusovník je odporúčaná metóda označovania poradia bajtov v špecifikácii Unicode. Napríklad pre UTF-16, ak prijímač dostane BOM FEFF, znamená to, že bajtový tok je Big-Endian; Ak je prijaté FFFE, znamená to, že bajtový tok je Little-Endian. UTF-8 nevyžaduje BOM na označenie poradia bajtov, ale môže sa použiť na označenie "Som UTF-8 zakódovaný". UTF-8 kódovanie kusovníka je EF BB BF (čo vidíte pri otvorení textu pomocou UltraEdit a prepnutí na hexadecimálne formáty). Takže ak prijímač prijme bajtový tok začínajúci EF BB BF, vie, že ide o kódovanie UTF-8.
|