HTTP Get请求中的Unicode字符

本文关键字:Unicode 字符 Get 请求 HTTP | 更新日期: 2023-09-27 18:20:07

我有一个C#REST Web服务,它公开了以下方法:

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

此方法根据用户指定的ID从数据库中获取信息。这个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++编写的,并使用winHTTP库调用这个RESTWebservice方法。我也用fiddler测试过,但我得到了同样的结果,即汉字显示为奇怪的字符。

如果我有一个"POST"方法,请求主体具有unicode字符,那么我的webservice方法可以毫无问题地获得请求主体。我甚至不需要做这样的事情:Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(requestBody));

我在这里错过了什么?在发送HTTP GET请求之前,我还需要做其他事情吗?

HTTP Get请求中的Unicode字符

C#可以处理的所有字符都是Unicode字符。

只有某些字符在URI中是有效的未转义字符。IRI中允许更多的URI,但我们需要一个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,因为它完全取消了它最初所做的事情。你看到的是mojibake而不是源中国字符串,这是后来的另一个问题。