Lesen von UTF-8 mit BOM-Markierung: Verständnis der unerwarteten BOM-Ausgabe
Beim Lesen von Dateien, die in UTF-8 mit einer Byte-Reihenfolge codiert sind Markieren Sie (Stückliste). Es ist möglich, dass die Stückliste in der Ausgabezeichenfolge enthalten ist. Dies liegt daran, dass die BOM, eine Unicode-Kennung, als bestimmte Bytesequenz am Anfang der Datei gespeichert wird.
Im angegebenen Java-Code werden FileReader und BufferedReader entsprechend für das Lesen von UTF-8-Dateien verwendet . Das Problem tritt jedoch in der folgenden Zeile auf:
text = new String(tmp.getBytes(), "UTF-8");
Diese Zeile versucht, die im tmp-String gespeicherten Bytes mithilfe des UTF-8-Zeichensatzes zu dekodieren. Die Methode getBytes() für einen String behält jedoch nicht die Stücklistenmarkierung aus der Originaldatei bei. Infolgedessen ignoriert der Dekodierungsprozess die Stückliste und sie geht praktisch verloren.
Um die Stücklistenmarkierung in der Ausgabezeichenfolge beizubehalten, ist eine geringfügige Anpassung des Codes erforderlich:
byte[] bytes = tmp.getBytes("UTF-8"); if (isUTF8WithBOM(bytes)) { text = new String(bytes, 3, bytes.length - 3); } else { text = new String(bytes, "UTF-8"); }
Die Methode isUTF8WithBOM prüft, ob das Byte-Array mit der UTF-8-Stücklistensequenz (0xEF, 0xBB, 0xBF) beginnt. Wenn „true“, wird das BOM entfernt, indem das Byte-Array so aufgeteilt wird, dass es beim dritten Byte beginnt. Dadurch wird sichergestellt, dass der anschließende Decodierungsprozess die Stücklistenmarkierung in die Ausgabezeichenfolge einbezieht.
Das obige ist der detaillierte Inhalt vonWie behalte ich die Stückliste beim Lesen von UTF-8-Dateien in Java bei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!