2010-06-30 77 views
0

我知道这个问题以前已经问过,但没有一个解决方案似乎适用于这个特定的问题。 我的Java应用程序从另一个服务器接收用户名。用户名有时包含UTF-8字符的十六进制表示。删除java中的十六进制UTF-8字符

例如:“Féçon”以F \ C3 \ A9 \ C3 \ A7on出现。

我在这个网站上找到的例子(大多数使用“getBytes”)都没有工作。不知道为什么。

所以我的问题是:如果你已经定义了一个字符串与这些字符,你怎么能删除它们,所以它看起来再次正确?

字符串测试= “F \ C3 \ A9 \ C3 \ A7on”

感谢:您可以通过以下自己试试吧! 迈克

回答

0

在这种情况下getBytes不会工作,因为它听起来像你的Java字符串中不包含任何Unicode字符;它只包含十五个表示unicode字符转义序列的常规ASCII字符。无论您的上游组件是什么,它都有可能导致转义。

因此,解决这个问题最简单的方法是看看“另一端”是否可以说服Unicode说话。如果是这样,你将直接在Java中获得角色,并且Bob是你的叔叔。

否则,你需要找到解码这些字符串的方法。我能想到的最简单的方法就是遍历,手动转换为char S和串联,这样的事情:

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(); 

这尚未经过测试,但它说明转动换码到字面的原则字符。

2

它不是最高性能的解决方案,但至少代码很短....您基本上是URL解码,其中\表示编码字符而不是%。所以下面的代码工作:

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