2012-01-12 49 views
3

我有一个C#REST web服务暴露下面的方法:Unicode字符请求

[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库调用此REST Webservice方法。我也用小提琴测试了这个,但是我得到了相同的结果,即中文字符显示为怪异字符。

如果我有一个“POST”方法,请求正文具有Unicode字符,我的webservice方法获取请求正文没有任何问题。我甚至不需要这样做:Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(requestBody));

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

回答

2

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

只有某些字符在URI中未转义。 IRI中允许使用更多,但我们需要一个URI。

在查询部分,您应始终使用Uri.EscapeDataString。它不仅将与中国deail:

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,而不是源中文字符串,这是后来的其他事情。