2012-01-12 71 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,而不是源中文字符串,這是後來的其他事情。