2010-06-30 3 views
0

Je sais que cette question a déjà été posée, mais aucune des solutions ne semble fonctionner pour ce problème particulier. Mon application Java reçoit un nom d'utilisateur d'un autre serveur. Le nom d'utilisateur contient parfois la représentation hexadécimale des caractères UTF-8. Par exemple: "Féçon" se présente comme F \ C3 \ A9 \ C3 \ A7on. Par exemple: "Féçon" se présente comme F \ C3 \ A9 \ C3 \ A7on.Suppression des caractères UTF-8 hexadécimaux dans Java

Aucun des exemples que j'ai trouvé sur ce site (la plupart d'entre eux utilisent "getBytes") travaillé. Aucune idée pourquoi. Donc, ma question est la suivante: si vous avez défini une chaîne avec ces caractères, comment pouvez-vous les supprimer pour qu'ils soient de nouveau droits? Vous pouvez vous-même en utilisant les éléments suivants:

test String = "F \ C3 \ A9 \ C3 \ A7on"

merci! Mike

Répondre

0

Dans ce cas getBytes ne fonctionnera pas parce que cela ressemble à votre chaîne Java ne contient pas de caractères Unicode; il contient juste quinze caractères ASCII réguliers qui représentent la séquence d'échappement des caractères Unicode. Il est probable que quel que soit votre composant amont, il est responsable de l'échappement.

La manière la plus simple de résoudre ce problème est de voir si l'autre extrémité peut être persuadée de parler Unicode. Si c'est le cas, vous obtiendrez les personnages directement dans Java et Bob votre oncle.

Sinon, vous devrez trouver un moyen de décoder ces chaînes. La façon la plus simple que je peux penser est à itérer, conversion manuelle char s et concaténer, quelque chose comme ceci:

StringBuilder result = new StringBuilder(); 
char[] input = inputStr.toCharArray(); 
for (int i = 0; i < input.length; i++) 
{ 
    switch (input[i]) 
    { 
     case '\\': 
     // Get the next two characters and turn it into a literal char 
     String escapeCodeStr = input[i+1] + input[i+2]; 
     char escapedChar = (char)Integer.parseInt(escapeCodeStr, 16); 
     result.append(escapedChar); 
     i += 2; // Move pointer to account for two extra characters read 
     break; 

     default: 
     result.append(input[i]); 
    } 
} 

return result.toString(); 

Cela n'a pas été testé, mais il illustre le principe de transformer les codes d'échappement en littéral personnages.

2

Ce n'est pas la solution la plus performante, mais au moins le code est court .... Vous êtes essentiellement un décodage d'URL, où \ indique un caractère codé au lieu de%. Ainsi, le code suivant fonctionne:

 
String s = "F\\C3\\A9\\C3\\A7on"; 
s = s.replace('\\', '%'); 
System.out.println(URLDecoder.decode(s, "UTF-8")); 
Questions connexes