88 votes

Lecture UTF-8 - Marqueur de nomenclature

Je lis un fichier à travers un FileReader - le fichier est décodé UTF-8 (avec BOM) maintenant mon problème est : je lis le fichier et sors une chaîne, mais malheureusement le marqueur BOM est sorti aussi. Pourquoi cela se produit-il ?

fr = new FileReader(file);
br = new BufferedReader(fr);
    String tmp = null;
    while ((tmp = br.readLine()) != null) {
    String text;    
    text = new String(tmp.getBytes(), "UTF-8");
    content += text + System.getProperty("line.separator");
}

sortie après la première ligne

?<style>

46voto

finnw Points 24592

La solution la plus simple est probablement de supprimer le résultat \uFEFF de la chaîne, car il est extrêmement peu probable qu'il apparaisse pour une autre raison.

tmp = tmp.replace("\uFEFF", "");

Voir aussi ce rapport de bogue Guava

40voto

peenut Points 1368

Utilisez la bibliothèque Apache Commons.

Classe : org.apache.commons.io.input.BOMInputStream

Exemple d'utilisation :

String defaultEncoding = "UTF-8";
InputStream inputStream = new FileInputStream(someFileWithPossibleUtf8Bom);
try {
    BOMInputStream bOMInputStream = new BOMInputStream(inputStream);
    ByteOrderMark bom = bOMInputStream.getBOM();
    String charsetName = bom == null ? defaultEncoding : bom.getCharsetName();
    InputStreamReader reader = new InputStreamReader(new BufferedInputStream(bOMInputStream), charsetName);
    //use reader
} finally {
    inputStream.close();
}

9voto

snakedoctor Points 157

Voici comment j'utilise Apache BOMInputStream, il utilise un bloc try-with-resources. L'argument "faux" indique à l'objet d'ignorer les nomenclatures suivantes (nous utilisons des fichiers texte "sans nomenclature" pour des raisons de sécurité, haha) :

try( BufferedReader br = new BufferedReader( 
    new InputStreamReader( new BOMInputStream( new FileInputStream(
       file), false, ByteOrderMark.UTF_8,
        ByteOrderMark.UTF_16BE, ByteOrderMark.UTF_16LE,
        ByteOrderMark.UTF_32BE, ByteOrderMark.UTF_32LE ) ) ) )
{
    // use br here

} catch( Exception e)

}

8voto

Adrian Smith Points 6087

Considérez UnicodeReader de Google qui fait tout ce travail pour vous.

Charset utf8 = Charset.forName("UTF-8"); // default if no BOM present
try (Reader r = new UnicodeReader(new FileInputStream(file), utf8)) {
    ....
}

Dépendance de Maven :

<dependency>
    <groupId>com.google.gdata</groupId>
    <artifactId>core</artifactId>
    <version>1.47.1</version>
</dependency>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X