我有一个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”仍然不包含中文字符。它看起来像是:ã³ãã«-太é
我有使用winHTTP库以C ++编写并调用此REST Webservice方法的客户端代码。我也用fiddler对它进行了测试,但是得到了相同的结果,即中文字符显示为奇怪的字符。
如果我有一个“POST”方法,请求正文具有unicode字符,我的webservice方法获取请求正文没有任何问题。我甚至不需要做这样的事情:Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(requestBody));
我在这里缺少什么?在发送HTTP GET请求之前,我还需要做任何其他事情吗?
答案 0 :(得分:2)
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
,因为它完全撤消了它的第一次做法。你看到mojibake而不是源中文字符串是其他东西后来搞砸了。