web-dev-qa-db-fra.com

Comment corriger l'octet non valide 1 de la séquence UTF-8 sur 1 octet

J'essaie de récupérer le XML ci-dessous à partir de DB en utilisant une méthode Java, mais je reçois une erreur

Code utilisé pour analyser le XML

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();

InputSource is = new InputSource(new ByteArrayInputStream(cond.getBytes()));

Document doc = db.parse(is);

Element elem = doc.getDocumentElement();

// here we expect a series of <data><name>N</name><value>V</value></data>
NodeList nodes = elem.getElementsByTagName("data");

TableID jobId = new TableID(_processInstanceId);
Job myJob = Job.queryByID(_clientContext, jobId, true);

if (nodes.getLength() == 0) {
    log(Level.DEBUG, "No data found on condition XML");

}

for (int i = 0; i < nodes.getLength(); i++) {
    // loop through the <data> in the XML

    Element dataTags = (Element) nodes.item(i);
    String name = getChildTagValue(dataTags, "name");
    String value = getChildTagValue(dataTags, "value");

    log(Level.INFO, "UserData/Value=" + name + "/" + value);

    myJob.setBulkUserData(name, value);
}

myJob.save();

Les données

<ContactDetails>307896043</ContactDetails>
<ContactName>307896043</ContactName>
<Preferred_Completion_Date>
</Preferred_Completion_Date>
<service_address>A-End Address: 1ST HELIERST HELIERJT2 3XP832THE CABLES 1 POONHA LANEST HELIER JE JT2 3XP</service_address>
<ServiceOrderId>315473043</ServiceOrderId>
<ServiceOrderTypeId>50</ServiceOrderTypeId>
<CustDesiredDate>2013-03-20T18:12:04</CustDesiredDate>
<OrderId>307896043</OrderId>
<CreateWho>csmuser</CreateWho>
<AccountInternalId>20100333</AccountInternalId>
<ServiceInternalId>20766093</ServiceInternalId>
<ServiceInternalIdResets>0</ServiceInternalIdResets>
<Primary_Offer_Name  action='del'>MyMobile Blue &#163;44.99 [12 month term]</Primary_Offer_Name>
<Disc_Reason  action='del'>8</Disc_Reason>
<Sup_Offer  action='del'>80000257</Sup_Offer>
<Service_Type  action='del'>A-01-00</Service_Type>
<Priority  action='del'>4</Priority>
<Account_Number  action='del'>0</Account_Number>
<Offer  action='del'>80000257</Offer>
<msisdn  action='del'>447797142520</msisdn>
<imsi  action='del'>234503184</imsi>
<sim  action='del'>5535</sim>
<ocb9_ARM  action='del'>false</ocb9_ARM>
<port_in_required  action='del'>
</port_in_required>
<ocb9_mob  action='del'>none</ocb9_mob>
<ocb9_mob_BB  action='del'>
</ocb9_mob_BB>
<ocb9_LandLine  action='del'>
</ocb9_LandLine>
<ocb9_LandLine_BB  action='del'>
</ocb9_LandLine_BB>
<Contact_2>
</Contact_2>
<Acc_middle_name>
</Acc_middle_name>
<MarketCode>7</MarketCode>
<Acc_last_name>Port_OUT</Acc_last_name>
<Contact_1>
</Contact_1>
<Acc_first_name>.</Acc_first_name>
<EmaiId>
</EmaiId>

L'erreur

 org.Apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.

J'ai lu dans certaines discussions, c'est à cause de caractères spéciaux dans le code xml . Comment résoudre ce problème?

24
shaiksha

Comment résoudre ce problème?

Lisez les données en utilisant le bon codage de caractères. Le message d'erreur signifie que vous essayez de lire les données au format UTF-8 (délibérément ou parce que c'est le codage par défaut d'un fichier XML qui ne spécifie pas <?xml version="1.0" encoding="somethingelse"?>), mais il s'agit en réalité d'un codage différent, tel que ISO-8859. 1 ou Windows-1252.

Pour pouvoir vous dire comment procéder, il faudrait que je voie le code que vous utilisez actuellement pour lire le code XML.

16
Ian Roberts
  1. Ouvrez le XML dans le bloc-notes 
  2. Assurez-vous de ne pas avoir d'espace supplémentaire au début et à la fin du document.
  3. Sélectionnez Fichier -> Enregistrer sous
  4. sélectionnez enregistrer en tant que type -> Tous les fichiers
  5. Entrez le nom du fichier comme abcd.xml
  6. sélectionnez Encodage - UTF-8 -> Cliquez sur Enregistrer.
14
Barani r

Essayer:

InputStream inputStream= // Your InputStream from your database.
Reader reader = new InputStreamReader(inputStream,"UTF-8");

InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");

saxParser.parse(is, handler);

Si c'est autre chose que UTF-8, changez juste la partie encodage pour la bonne.

7
LaGrandMere

J'obtenais le xml en tant que chaîne et j'utilisais xml.getBytes () pour obtenir cette erreur. Passer à xml.getBytes (Charset.forName ("UTF-8")) a fonctionné pour moi. 

3
John

J'ai eu ce problème, mais le fichier était en UTF-8, c'était juste que quelque part sur le caractère était entré qui n'était pas encodé en UTF-8. Pour résoudre le problème, j’ai fait ce qui est dit dans ce fil de discussion, c’est-à-dire que j’ai validé le fichier: Comment vérifier si un fichier est valide au format UTF-8?

Fondamentalement, vous exécutez la commande:

$ iconv -f UTF-8 votre_fichier -o/dev/null

Et si quelque chose n'est pas encodé en UTF-8, il vous donnera les numéros de ligne et de ligne afin que vous puissiez le trouver.

1
Robert Sjödahl

Ceux qui, comme moi, comprennent les principes de codage des caractères, lisez également l'article de Joel qui est drôle car il contient de toute façon des caractères incorrects et ne peuvent toujours pas comprendre ce que diable (alerte spoiler, je ' m utilisateur Mac), votre solution peut être aussi simple que supprimer votre référentiel local et le cloner à nouveau.

Ma base de code n'a pas changé depuis la dernière fois qu'elle fonctionnait bien, il était donc insensé de commettre des erreurs UTF, étant donné que notre système de construction ne s'en est jamais plaint ... jusqu'à ce que je me souvienne d'avoir débranché mon ordinateur par inadvertance il y a quelques jours. avec IntelliJ Idea et tout le processus (Java/Tomcat/Hibernate)

Mon Mac a fait un travail remarquable en prétendant que rien ne s'était passé et que j'ai poursuivi ses activités comme d'habitude, mais le système de fichiers sous-jacent a été corrompu. Nous avons perdu toute la journée à essayer de comprendre celui-ci. J'espère que ça aide quelqu'un.

0
felipe

J'ai eu le même problème. Mon problème était qu'il manquait l'argument «-Dfile.encoding = UTF8» sous Java_OPTION dans le fichier statWeblogic.cmd du serveur WebLogic.

0
chk.buddi

Il m'est arrivé de rencontrer ce problème à cause d'une version Ant.

Cette génération Ant a pris des fichiers et y a appliqué filterchain expandproperties. Au cours de ce filtrage de fichiers, le codage de caractères implicite par défaut non UTF-8 de ma machine Windows a été utilisé pour générer les fichiers filtrés. Par conséquent, les caractères extérieurs à son jeu de caractères ne pouvaient pas être mappés correctement.

Une solution consistait à fournir à Ant une variable d’environnement explicite pour UTF-8 . Dans Cygwin, avant de lancer Ant: export ANT_OPTS="-Dfile.encoding=UTF-8".

0
Abdull

J'ai eu le même problème dans mon application JSF qui avait une ligne de commentaire contenant des caractères spéciaux dans la page XMHTL. Quand j'ai comparé la version précédente de mon Eclipse, il y avait un commentaire,

//Some �  special characters found

Supprimé ces caractères et la page chargée bien. Généralement, il s'agit de fichiers XML, comparez-le donc avec la version de travail.

0
Lucky

J'ai rencontré le même problème et après une longue enquête de mon fichier XML, j'ai trouvé le problème: il y avait peu de caractères non échappés comme «».

0
Artsiom Miklushou