BOM-ensimmäisten merkkien ongelma, joka ilmenee Unicode-tiedostoja lukiessa Javalla (UTF-8 jne.) ja miten niitä käsitellään
Windowsissa tekstieditorilla luodut tekstitiedostot saavat BOM-ID:n tiedoston otsikkoon (ensimmäiseen merkkiin), jos haluat tallentaa ne Unicode-muodossa, kuten UTF-8:ssa.
Tätä tunnistetta ei poisteta, kun tiedosto luetaan Javalla, eikä String.trim():ää voi poistaa. Jos käytät readLine():tä lukeaksesi ensimmäisen rivin ja tallentaaksesi sen merkkijonoon, merkkijonon pituus on 1 suurempi kuin mitä näet, ja ensimmäinen merkki on tämä BOM.
Tämä voi aiheuttaa ongelmia, esimerkiksi lukiessasi ini-tiedostoa, jos haluat tietää, alkaako ensimmäinen rivi "[":llä, et osaa arvioida oikein.
Onneksi, kun Java lukee Unicode-tiedostoja, se vaihtaa BOM:n tasaisesti muotoon "\uFEFF", joten voit ratkaista sen manuaalisesti (tuomion jälkeen käytä substring() tai replace() poistaaksesi tämän BOM:n):
Kuitenkin,Tämä lähestymistapa ei ole täydellinenJos generoitu jar-tiedosto toimii Windowsissa, ongelma on silti olemassa. Paras kiertotapa on käyttää apache commons io:n tarjoamaa BOMInputStreamia:
Mikä on BOM?
BOM = tavujärjestysmerkki BOM on suositeltu tapa merkitä tavujen järjestys Unicode-määrittelyssä. Esimerkiksi UTF-16:ssa, jos vastaanottaja saa BOM-arvon FEFF, se osoittaa, että tavuvirta on Big-Endian; Jos FFFE vastaanotetaan, se tarkoittaa, että tavuvirta on Little-Endian. UTF-8 ei vaadi BOM:ia tavujärjestyksen osoittamiseen, mutta sitä voidaan käyttää ilmaisemaan "I am UTF-8 encoded". BOM:n UTF-8-koodaus on EF BB BF (kuten nähdään avaamalla tekstin UltraEditillä ja vaihtamalla heksadesimaaliin). Jos vastaanottaja saa tavuvirran, joka alkaa EF BB BF:llä, se tietää, että kyseessä on UTF-8-koodaus.
|