Символы Юникода в HTTP-запросе Get - PullRequest
3 голосов
/ 12 января 2012

У меня есть C # REST Webservice, предоставляющий следующий метод:

[OperationContract]
        [WebGet
            (
            BodyStyle = WebMessageBodyStyle.Bare,
            RequestFormat = WebMessageFormat.Xml,
            ResponseFormat = WebMessageFormat.Xml,
            UriTemplate = "/Files?id={ID}"
            )
        ]
        Stream GetFilesForID(string ID);

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

Моя реализация метода:

public Stream GetFilesForID(string ID)
{
    ID = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(ID));

    // and connect to database and
    // stream back the list.
}

"ID" по-прежнему не содержит китайских символов.Это выглядит так: ã³ãã«-太é

У меня есть клиентский код, который написан на C ++ и вызывает этот метод REST Webservice с использованием библиотеки winHTTP.Я также проверил это, используя fiddler, но я получаю тот же результат, т.е. китайские иероглифы отображаются как странные символы.

Если у меня есть метод «POST» с телом запроса, содержащим символы Юникода, мой метод веб-сервиса получает тело запроса без каких-либо проблем.Мне даже не нужно делать ничего подобного: Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(requestBody));

Что мне здесь не хватает?Нужно ли что-то еще делать перед отправкой запроса HTTP GET?

1 Ответ

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

Все символы, которые C # может обрабатывать, являются символами Unicode.

Только некоторые символы допустимы без экранирования в URI.В IRI разрешено больше, но здесь нам нужен URI.

В части запроса вы всегда должны использовать Uri.EscapeDataString.Не только с китайским:

Uri.EscapeDataString("孫子兵法 孫武")
//returns %E5%AD%AB%E5%AD%90%E5%85%B5%E6%B3%95%20%E5%AD%AB%E6%AD%A6

, но и с проблемным английским и другими языками:

Uri.EscapeDataString("A naïve approach = trouble waiting + bugs & complaints!")
//A%20na%C3%AFve%20approach%20%3D%20trouble%20waiting%20%2B%20bugs%20%26%20complaints!

Кстати, ID = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(ID)) эквивалентно ID = ID, потому что точно отменяетчто он делает первымТо, что вы видели моджибаке вместо исходной китайской строки, было чем-то другим, чёрт побери позже.

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