Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 14853|Απάντηση: 0

[Πηγή] Προβλήματα προθέματος BOM που αντιμετωπίζονται κατά την ανάγνωση αρχείων Unicode (UTF-8, κ.λπ.) σε Java

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 14/1/2019 4:26:17 μ.μ. | | |
Το πρόβλημα των πρώτων χαρακτήρων 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.





Προηγούμενος:Συνήθεις λύσεις σφαλμάτων Jackson
Επόμενος:Μπάρμαν λογισμικού γραμμωτού κώδικα!
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com