2011-01-12 121 views
1

我正在構建一個使用HttpListener來處理請求的簡單服務器。如果有必要,我發送給它的查詢字符串參數是url編碼。例如,要發送漢字字符串"尺八",編碼是"%E5%B0%BA%E5%85%AB"如何處理HttpListenerRequest中的Url編碼?

我的示例網址是"/?q=%E5%B0%BA%E5%85%AB"

在我的上下文的回調,我有:

HttpListenerContext context = Listener.EndGetContext(); 
string rawUrl = context.Request.RawUrl; 
string query = context.Request.QueryString["q"]; 

檢查結果,我得到:

rawUrl = "/?q=%E5%B0%BA%E5%85%AB" 
query = "尺八" 

但是,如果我看context.Request.Url,我得到{http://localhost:8080/?q=尺八}

看起來好像使用UTF-8以外的編碼對context.Request.QueryString中的查詢字符串進行了解碼。

我的解決方法是忽略context.Request.QueryString,並通過這樣做創建自己:

var queryString = HttpUtility.ParseQueryString(context.Request.Url.Query); 

這給了我正確的值,但它似乎是一個黑客的東西。

有什麼辦法可以告訴HttpListener(或上下文或請求)將查詢字符串解釋爲UTF-8,我認爲這是標準嗎?或者我應該只用這種解決方法?

+1

你確定有一些不錯的查詢字符串:D – 2011-03-03 12:33:25

+0

Downvoter?習慣上提供解釋性評論。 – 2014-12-17 15:19:01

回答

2

通過查看代碼,它依賴於將ContentEncoding設置爲UTF8。下面是從HttpListenerRequest的查詢字符串屬性的snipit:

public NameValueCollection QueryString 
{ 
    get 
    { 
     NameValueCollection nvc = new NameValueCollection(); 
     Helpers.FillFromString(nvc, this.Url.Query, true, this.ContentEncoding); 
     return nvc; 
    } 
} 

由於沒有辦法修改ContentEncoding財產你堅持你的「黑客」。無論如何,我認爲你使用HttpUtility.ParseQueryString可能會爲你提供最好的服務。