Το πρόβλημα των πρώτων χαρακτήρων BOM που αντιμετωπίζονται κατά την ανάγνωση αρχείων Unicode (UTF-8, κ.λπ.) σε Java και πώς να τα αντιμετωπίσετε
Τα αρχεία κειμένου που δημιουργούνται με ένα πρόγραμμα επεξεργασίας κειμένου στα Windows θα έχουν ένα αναγνωριστικό BOM που προστίθεται στην κεφαλίδα του αρχείου (ο πρώτος χαρακτήρας) εάν επιλέξετε να τα αποθηκεύσετε σε μορφή Unicode όπως το UTF-8.
Αυτή η αναγνώριση δεν αφαιρείται όταν το αρχείο διαβάζεται σε Java και η String.trim() δεν μπορεί να αφαιρεθεί. Εάν χρησιμοποιήσετε το readLine() για να διαβάσετε την πρώτη γραμμή και να την αποθηκεύσετε στη συμβολοσειρά, το μήκος της συμβολοσειράς θα είναι 1 μεγαλύτερο από αυτό που βλέπετε και ο πρώτος χαρακτήρας είναι αυτός ο BOM.
Αυτό μπορεί να προκαλέσει κάποιο πρόβλημα, όπως κατά την ανάγνωση ενός αρχείου ini, εάν θέλετε να καταλάβετε εάν η πρώτη γραμμή ξεκινά με "[", δεν μπορείτε να κρίνετε σωστά.
Ευτυχώς, όταν η Java διαβάζει αρχεία Unicode, αλλάζει ομοιόμορφα το BOM σε "\uFEFF", ώστε να μπορείτε να το λύσετε χειροκίνητα (μετά την κρίση, χρησιμοποιήστε substring() ή replace() για να αφαιρέσετε αυτό το BOM):
Ωστόσο,Αυτή η προσέγγιση δεν είναι τέλειαΕάν το αρχείο jar που δημιουργήθηκε εκτελείται στα Windows, εξακολουθεί να υπάρχει πρόβλημα. Η τελική λύση είναι να χρησιμοποιήσετε το BOMInputStream που παρέχεται από το apache commons io:
Τι είναι το BOM;
BOM = Σήμα σειράς byte Το BOM είναι η συνιστώμενη μέθοδος επισήμανσης της σειράς των byte στην προδιαγραφή Unicode. Για παράδειγμα, για το UTF-16, εάν ο δέκτης λάβει ένα BOM FEFF, αυτό σημαίνει ότι η ροή byte είναι Big-Endian. Εάν ληφθεί το FFFE, σημαίνει ότι η ροή byte είναι Little-Endian. Το UTF-8 δεν απαιτεί BOM για να υποδείξει τη σειρά byte, αλλά μπορεί να χρησιμοποιηθεί για να υποδείξει "Είμαι κωδικοποιημένος UTF-8". Η κωδικοποίηση UTF-8 του BOM είναι EF BB BF (όπως φαίνεται ανοίγοντας το κείμενο με το UltraEdit και μεταβαίνοντας σε δεκαεξαδικό). Έτσι, εάν ο δέκτης λάβει μια ροή byte που ξεκινά με EF BB BF, γνωρίζει ότι πρόκειται για κωδικοποίηση UTF-8.
|