当前位置: 代码迷 >> java >> 在Java中删除十六进制UTF-8字符
  详细解决方案

在Java中删除十六进制UTF-8字符

热度:81   发布时间:2023-08-02 10:26:51.0

我知道以前曾有人问过这个问题,但是似乎没有一个解决方案可以解决这个特定问题。 我的Java应用程序从另一台服务器接收用户名。 用户名有时包含UTF-8字符的十六进制表示形式。

例如:“Fé?on”以F \\ C3 \\ A9 \\ C3 \\ A7on的形式出现。

我在此站点上找到的所有示例(大多数都使用“ getBytes”)均无效。 不知道为什么。

所以我的问题是:如果您已经用这些字符定义了String,那么如何删除它们,使其看起来又正确呢? 您可以使用以下方法自己尝试:

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

谢谢! 麦克风

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

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

在这种情况下, 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();

尚未对此进行测试,但是它说明了将转义码转换为文字字符的原理。

  相关解决方案