web-dev-qa-db-fra.com

Caractère illégal - CTRL-CHAR

Je reçois exceptopn de webservices: 

com.ctc.wstx.exc.WstxUnexpectedCharException: caractère illégal ((CTRL-CHAR, code 15))

Je connais la raison derrière cela, je reçois des "caractères de contrôle" dans les données que je veux renvoyer. Et en xml CTRL-CHAR ne sont pas autorisés.

J'ai cherché la solution et de nombreux endroits où j'ai trouvé le code pour supprimer CTRL-CHAR

Le problème est de savoir si je vais perdre des données si je supprime les caractères de contrôle des données. Je souhaite que la solution propre puisse encoder. Au lieu de supprimer le caractère de contrôle.

14
jaxb

Merci les gars pour vos entrées. Je partage la solution pourrait être utile pour les autres. L’exigence n’était pas d’effacer CONTROL CHAR, il devrait rester tel quel dans la base de données également et un WS doit l’envoyer à travers n/w client doit pouvoir obtenir CONTROL CHAR. J'ai donc implémenté le code comme suit: 

  1. Encodez les chaînes en utilisant URLEncoder dans le code du service Web. 
  2. Sur le côté client, décodez-le en utilisant URLDecoder 

Partage de l'exemple de code et des résultats ci-dessous.
Exemple de code:  

System.out.println("NewSfn");  
System.out.println(URLEncoder.encode("NewSfn", "UTF-8"));  
System.out.println(URLDecoder.decode("NewSfn", "UTF-8"));  

Sortie:  

NewSfn  
New%0FSfn  
NewSfn 

Ainsi, le client recevra des CHARGES DE CONTRÔLE.

EDIT: Stack Exchange n’affiche pas CONTROL CHAR ci-dessus. NewSfn est comme ceci New(CONTROL CHAR)Sfn.

5
jaxb

Je ferais ce que suggère OrangeDog. Mais si vous voulez le résoudre dans votre code, essayez:

replaceAll("[\\x00-\\x09\\x11\\x12\\x14-\\x1F\\x7F]", "")

\\x12 est le caractère.

Cordialement.

10
ssedano

Cette erreur est générée par l'analyseur XML Woodstox. Le code source de la classe InputBootstrapper se présente comme suit:

protected void reportUnexpectedChar(int i, String msg)
    throws WstxException
{
    char c = (char) i;
    String excMsg;

    // WTF? JDK thinks null char is just fine as?!
    if (Character.isISOControl(c)) {
        excMsg = "Unexpected character (CTRL-CHAR, code "+i+")"+msg;
    } else {
        excMsg = "Unexpected character '"+c+"' (code "+i+")"+msg;
    }
    Location loc = getLocation();
    throw new WstxUnexpectedCharException(excMsg, loc, c);
}

Commentaire amusant mis à part, Woodstox effectue une validation supplémentaire par-dessus l'analyseur JDK et rejette le ASCII caractère 15 comme invalide.

Quant à savoir pourquoi ce personnage est là, nous ne pouvons pas vous le dire, cela se trouve dans vos données. De même, nous ne pouvons pas vous dire si le fait de supprimer ce personnage cassera quoi que ce soit, car là encore, ce sont vos données. Vous ne pouvez l’établir que pour vous-même.

5
skaffman

Si vous avez des caractères de contrôle dans vos données texte, vous devez résoudre ce problème à la source.

Les causes les plus probables sont des encodages de communication incorrects (généralement entre la base de données et l'application) ou une désinfection de la saisie de l'utilisateur.

2
OrangeDog

J'ai rencontré le même problème lorsque je passais des valeurs null pour certains paramètres. J'ai passé des valeurs vides ou clés à la place et cette erreur a disparu.

0
colin

La réponse de @ ssedano me laisse un peu perplexe, il me semble qu'il essaie de trouver tous les caractères de contrôle de la table ASCII table 0x00 à 0x1F, à l'exception de 0x0A (nouvelle ligne) et 0x0D (retour chariot) plus 0x7F ( del), alors il n'y aurait pas de regex

replaceAll("[\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F]", "")
0
user2562934