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.
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:
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
.
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.
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.
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.
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.
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]", "")