Problém s prvními znaky BOM, na které se setkáme při čtení Unicode souborů (UTF-8 atd.) v Javě a jak s nimi naložit
Textové soubory vytvořené textovým editorem ve Windows budou mít k hlavičce souboru přidaný ID BOM (první znak), pokud je chcete uložit ve formátu Unicode, například UTF-8.
Tato identifikace není odstraněna při čtení souboru v Javě a String.trim() nelze odstranit. Pokud použijete readLine() k přečtení prvního řádku a uložení do řetězce, délka řetězce bude o 1 větší než to, co vidíte, a první znak je tento kusovník (BOM).
To může způsobit určité potíže, například při čtení ini souboru, pokud chcete zjistit, jestli první řádek začíná na "[", nemůžete správně posoudit.
Naštěstí, když Java čte Unicode soubory, jednotně změní BOM na "\uFEFF", takže to můžete vyřešit ručně (po vyhodnocení použít substring() nebo replace() k odstranění tohoto BOM):
Nicméně,Tento přístup není dokonalýPokud vygenerovaný jar soubor běží ve Windows, problém stále existuje. Konečným řešením je použít BOMInputStream poskytovaný apache commons io:
Co je to BOM?
BOM = Řád bajtů BOM je doporučená metoda označování pořadí bajtů ve specifikaci Unicode. Například pro UTF-16, pokud přijímač obdrží BOM FEFF, znamená to, že bajtový proud je Big-Endian; Pokud je přijato FFFE, znamená to, že bajtový proud je Little-Endian. UTF-8 nevyžaduje BOM pro označení pořadí bajtů, ale může být použit k označení "Jsem kódován UTF-8". UTF-8 kódování BOM je EF BB BF (jak je vidět při otevření textu pomocí UltraEdit a přechodu na hexadecimální formát). Takže pokud přijímač přijme bajtový proud začínající na EF BB BF, ví, že jde o kódování UTF-8.
|