Дезинфицировать иностранные символы / акценты с URL - PullRequest
5 голосов
/ 21 января 2012

Мне нужно написать серверную функцию для очистки строк в кодировке URL.

Пример строки запроса:

FirstName=John&LastName=B%F3th&Address=San+Endre+%FAt+12%2F14

Когда я передаю это через HttpUtility.UrlDecode(), я получаю:

FirstName=John&LastName=B�th&Address=San Endre �t 12/14

Функция из этого ТАК выглядит отлично, но она ожидает декодированные строки, которые уже имеют акценты:

RemoveDiacritics('Bóth`) ==> 'Both';
RemoveDiacritics('San Endre út 12/14`) ==> 'San Endre ut 12/14';

Как я могу декодировать URL, не получая все эти символов?

Я не могу ничего сделать на стороне клиента или изменить способ, которым они входят в мою функцию.

Ответы [ 3 ]

7 голосов
/ 21 января 2012

Я согласен с аргументами, уже выдвинутыми;однако, если вы всегда получаете ваши закодированные строки от одного и того же клиента, вы можете сопоставить их кодировку.В этом случае они, похоже, используют ISO / IEC 8859-1 , неофициально известный как Latin-1 , который является одним из самых популярных используемых 8-битных наборов символов.Вы можете декодировать ISO / IEC 8859-1, используя следующий код (который будет правильно декодировать предоставленную вами строку примера):

HttpUtility.UrlDecode(encodedInput, Encoding.GetEncoding("iso-8859-1"));

MSDN гарантирует, что вышеуказанная кодовая страница будет изначально поддерживаться .NET Frameworkнезависимо от базовой платформы;обратитесь к таблице поддерживаемых кодировок для Класс кодирования .

2 голосов
/ 21 января 2012

UrlDecode ожидает UTF-8 для своего ввода, где каждый символ больше \ u007F кодируется как минимум 2 байта.Таким образом, правильная строка (если символ \ u00F3, ó) содержала бы %C3%B3, а не %F3.

Если строки приходят так, как вы их получаете, я не уверен, что высможет сделать.Не со стандартными библиотеками, то есть.

Кстати, удаление акцентов с иностранных символов - это нормально, но я бы не назвал это "санацией".

1 голос
/ 21 января 2012

% F3 и% FA не находятся ни в кодировке UTF8, ни в кодировке ASCII. Похоже, код на стороне клиента кодирует строку в локали текущей страницы.

В зависимости от ваших потребностей, вы можете либо просто удалить все символы выше 127, либо выяснить, как правильно декодировать входящий URL (я не думаю, что встроенная функция существует, чтобы обрабатывать ее как есть).

Я бы скопировал символы в байтовый массив (включая декодированные вручную% -кодированные) и использовал бы правильное кодирование для преобразования его в строку (используя Encoding.GetString - http://msdn.microsoft.com/en-us/library/system.text.encoding.getstring.aspx).

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