Howto laisser l'analyseur SAX déterminer l'encodage à partir de la déclaration xml?
Je suis en train d'analyser des fichiers xml à partir de différentes sources (sur lequel j'ai peu de contrôle). La plupart d'entre eux sont encodés en UTF-8 et ne cause pas de problèmes à l'aide de l'extrait de code suivant:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
FeedHandler handler = new FeedHandler();
InputSource is = new InputSource(getInputStream());
parser.parse(is, handler);
Depuis SAX valeur par défaut est UTF-8, ce qui est correct. Cependant, certains documents déclarer:
<?xml version="1.0" encoding="ISO-8859-1"?>
Même si l'ISO-8859-1 est déclaré SAX encore de la valeur par défaut est UTF-8.
Seulement si j'ajoute:
is.setEncoding("ISO-8859-1");
Sera SAX utiliser l'encodage correct.
Comment puis-je laisser SAX détecter automatiquement l'encodage correct de la déclaration xml, sans moi, plus précisément le définir? J'ai besoin de cela parce que je ne sais pas à quoi l'encodage du fichier sera.
Merci d'avance,
Allan
Vous devez vous connecter pour publier un commentaire.
Utilisation InputStream comme argument pour InputSource quand vous voulez Sax à la détection automatique de l'encodage.
Si vous souhaitez définir un codage spécifique, utilisez Lecteur avec un encodage spécifié ou setEncoding méthode.
Pourquoi? Parce que détection automatique de l'encodage des algorithmes nécessitent des données brutes, pas de conversion de caractères.
La question du sujet est: Comment permettre à l'analyseur SAX déterminer l'encodage à partir de la déclaration xml? J'ai trouvé Allan, la réponse à la question trompeuse et j'ai fourni l'alternative, fondée sur Jörn Horstmann du commentaire et de mon expérience.
<?xml encoding=''?>
PI que si leInputSource
est construit à partir d'unInputStream
exemple; cela ne fonctionnera pas s'il est construit à partir d'unReader
(parce que le point deReader
est que sa sortie est post-décodage'). Qui est:new InputSource(getInputStream())
est correct.J'ai trouvé la réponse moi-même.
L'analyseur SAX utilise InputSource à l'interne et de l'InputSource docs:
Donc, fondamentalement, vous avez besoin pour passer un flux de caractères à l'analyseur pour qu'il pick-up de l'encodage correct. Consultez la solution ci-dessous: