Удаление шестнадцатеричных символов UTF-8 в Java - PullRequest
0 голосов
/ 30 июня 2010

Я знаю, что этот вопрос задавался ранее, но ни одно из решений не помогло решить эту конкретную проблему.Мое приложение Java получает имя пользователя с другого сервера.Имя пользователя иногда содержит шестнадцатеричное представление символов UTF-8.

Например: «Féçon» записывается как F \ C3 \ A9 \ C3 \ A7on.

Ни один из примеров, которые я нашелна этом сайте (большинство из них используют "getBytes") работал.Понятия не имею, почему.

Итак, мой вопрос: если вы определили строку с этими символами, как вы можете удалить их, чтобы она снова выглядела правильно?Вы можете попробовать сами, используя следующее:

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

спасибо!Mike

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

Это не самое эффективное решение, но, по крайней мере, код короткий .... Вы в основном декодируете URL, где \ обозначает закодированный символ вместо%.Так работает следующий код:

String s = "F\\C3\\A9\\C3\\A7on";
s = s.replace('\\', '%');
System.out.println(URLDecoder.decode(s, "UTF-8"));
0 голосов
/ 30 июня 2010

В этом случае getBytes не будет работать, потому что звучит так, как будто ваша Java строка не содержит символов Юникода;он просто содержит пятнадцать обычных символов ASCII, которые представляют escape-последовательность символов Unicode.Вполне вероятно, что независимо от того, является ли ваш вышестоящий компонент ответственным за выход.

Поэтому самый простой способ решить эту проблему - посмотреть, можно ли убедить "другой конец" говорить в Unicode.Если это так, вы получите символы непосредственно в Java, а Боб - ваш дядя.

В противном случае вам нужно будет найти какой-нибудь способ декодирования этих строк.Самым простым способом, который я могу придумать, является итерация, ручное преобразование в 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();

Это не было проверено, но оно иллюстрирует принцип поворотаescape-коды в буквенные символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...