2016-03-16 2 views
1

J'essaie de trouver une façon générique d'obtenir du texte à partir d'un fichier. Assez facile, sauf qu'il est obligatoire de supprimer les principaux caractères de la nomenclature. Pour l'UTF-8, j'ai eu ce travail. J'ai utilisé un modèle de regex pour que:Lecture de texte à partir d'un fichier avec le caractère BOM UTF-16

Pattern LEADING_BOM_PATTERN = Pattern.compile("^\uFEFF+"); 

Charset encoding; // This is given. 
InputStream input; // This is created. 

// Remove the leading BOM characters. 
String text = IOUtils.toString(input, encoding); 
text = LEADING_BOM_PATTERN.matcher(text).replaceFirst(""); 

Maintenant, mon problème: cela fonctionne parfaitement pour UTF-8 caractères de nomenclature (EF BB BF), mais pas pour l'une des autres. Cependant, comme il indique here:

Les octets exacts comprenant la nomenclature sera quel que soit le caractère Unicode U + FEFF est converti en par ce format de transformation.

Ce qui m'a fait supposer que le caractère "\ uFEFF" fonctionnerait pour tous les caractères de nomenclature. Il s'avère que ce n'est pas le cas. Après un peu plus de recherche, il s'est avéré que les deux caractères BOM "FE FF" et "FF FE" sont lus en tant que char 65533 par Java, tandis que la chaîne "\ uFEFF" se résout en char 65279. Cela efface pourquoi les caractères ne sont pas supprimés, mais je ne crois pas que ce soit un comportement attendu. Quelqu'un peut-il faire la lumière sur pourquoi il fait cela, ou plutôt comment y remédier? Merci :)

Répondre

1

Il s'avère que c'était juste une erreur vraiment stupide. Je n'ai pas passé le bon encodage aux IOUtils. Par conséquent, il ne renvoie pas les bons caractères. Au passage du jeu de caractères UTF-16, cela fonctionne bien. Idiote moi ...