问题描述
我知道以前曾有人问过这个问题,但是似乎没有一个解决方案可以解决这个特定问题。 我的Java应用程序从另一台服务器接收用户名。 用户名有时包含UTF-8字符的十六进制表示形式。
例如:“Fé?on”以F \\ C3 \\ A9 \\ C3 \\ A7on的形式出现。
我在此站点上找到的所有示例(大多数都使用“ getBytes”)均无效。 不知道为什么。
所以我的问题是:如果您已经用这些字符定义了String,那么如何删除它们,使其看起来又正确呢? 您可以使用以下方法自己尝试:
字符串测试=“ F \\ C3 \\ A9 \\ C3 \\ A7on”
谢谢! 麦克风
1楼
它不是性能最高的解决方案,但是至少代码很短。...您基本上是URL解码,其中\\表示编码字符而不是%。 因此,以下代码有效:
String s = "F\\C3\\A9\\C3\\A7on"; s = s.replace('\\', '%'); System.out.println(URLDecoder.decode(s, "UTF-8"));
2楼
在这种情况下, getBytes
将不起作用,因为听起来您的Java字符串不包含任何Unicode字符。
它仅包含十五个常规ASCII字符,代表Unicode字符的转义序列。
不管上游组件是什么,它都有逃逸的责任。
解决这个问题的最简单方法是查看“另一端”是否可以说出Unicode。 如果是这样,您将直接在Java中获得字符,而Bob是您的叔叔。
否则,您将需要找到一些解码这些字符串的方法。
我能想到的最简单的方法是遍历,手动转换为char
并进行连接,如下所示:
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();
尚未对此进行测试,但是它说明了将转义码转换为文字字符的原理。