2015-11-03 11 views
1

我有POST請求打我的web-api應用程序和內容類型標題包含'charset = ISO-8859-1'。以字符集= ISO-8859-1接收POST請求 - 如何轉換爲UTF-8?

但某些符號(包括英鎊符號)在鑽石中出現爲一個有趣的問號。

enter image description here

據我暫停我的代碼執行起來作爲控制器(因此自動模型綁定後)。檢查模型的內容在這一點上是顯示不支持的符號,像我上面的圖像示例。

有誰知道如果web-api會自動將內容傳遞到模型中保持字符集ISO-8859-1完好?

我試圖轉換我的模型中所有不支持的字符所在的字段之一。我用過微軟在這裏發現的一個例子:https://msdn.microsoft.com/en-us/library/kdcak6ye(v=vs.110).aspx

我以爲它已經工作了,因爲那些有趣的外觀的鑽石被普通的問號所取代。我遇到的問題是兩個字符集之間的翻譯/映射不是100%,因爲英鎊貨幣符號現在顯示爲正常問號。我現在開始懷疑自動模型綁定是否已經在某種程度上完成了字符集轉換,阻礙了我的嘗試。

如果我按我的方式,我會要求客戶端更改正在呈現的字符集,但現在這不是一個選項。

謝謝。

回答

2

當POSTed內容到達api控制器的一個方法時,所有字符串都已經轉換爲CLR的內部2個字節,每個字符的Unicode表示使用System.Text.Encoding,它應該與Content-Type頭中指定的字符集相匹配。

如果您在字符串變量/字段中看到帶有問號的鑽石,則爲時已晚,因爲這意味着Encoding無法正確解析字節流,並將這些字符用作後備。請注意,對於'¬'和'£'字符,您都有完全相同的菱形符號。

不同Encoding實現可能會使用不同的佔位符號,更具體地說,與默認使用普通問號的iso-8859-1編碼不同,具有問號符號的菱形是Utf8編碼的默認回退字符。因爲你看到菱形符號,它看起來像你的請求實際上由Utf8編碼處理,這是相當不尋常的,因爲你說Content-Type指定8859-1。

在網頁API原始HTTP請求和響應的formatting/parsingHttpConfiguration.Formatters配置的System.Net.Http.Formatting.MediaTypeFormatter後裔它默認配置爲具有以下四種情況進行處理:

[0]: {System.Net.Http.Formatting.JsonMediaTypeFormatter} 
[1]: {System.Net.Http.Formatting.XmlMediaTypeFormatter} 
[2]: {System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter} 
[3]: {System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter} 

每個那些有SupportedEncodings屬性,確定格式器準備處理哪些編碼。默認情況下,前兩個配置爲處理Utf8和Unicode,即Utf16,但它們配置爲在輸入流中遇到錯誤而不是插入後備字符時引發異常。

#3,FormUrlEncodedMediaTypeFormatter沒有使用SupportedEncodings財產和公正處理任何根據的Content-Type頭中指定的字符集,它在我的測試中正確處理解碼。

您可以啓用對Web API的跟蹤,以查看它是否會爲實際正在發生的事情提供一些提示,特別是在請求在處理api控制器之前正在處理的過程中發生任何異常情況時。

您的問題的另一個可能的原因可能是客戶端不能正確處理編碼,這意味着Content-Type中指定的值與請求的實際字節流不匹配。您可以使用網絡分析器(如WireShark)或通過爲System.Net.Sockets啓用tracing來檢查原始流。

+0

謝謝邁克爾。這是一個明確和詳細的答案,給了我更清晰的背景。關於這一點,我已經能夠通過訪問原始數據並清理它來排序我的問題。 :O) – Sulphy