2012-03-11 173 views
3

我一直在WebClient上遇到問題, 版本在真實設備上的版本不同於iOS模擬器的調試模式。在MonoTouch中構建發佈版本時WebClient編碼問題

顯然是從服務器的響應得到不同的解釋,並在釋放斷裂構造: Screenshot from the DEBUG build running in the iOS Simulator Screenshot from the RELEASE build running on an iPhone 4S

This question似乎有一個類似的問題的答案,但我不想硬編碼的編碼即使應用程序在其生命週期中可能沒有更改,但由於信息已包含在HTTP response中,因此似乎是錯誤的。

我已經打開了一個問題與Xamarin進一步調查。

回答

4

有在這裏打球兩個因素。第一:

似乎錯了也這樣做的信息都已經包含在HTTP響應

是的,它錯了,但微軟.NET的WebClient.Encoding在默認情況下,相同System.Text.Encoding.Default

MSDN報價:

此屬性的默認值默認返回的編碼。

這樣單(和MonoTouch的)執行的行爲WebClient相同。這經常被忽略(當時正在運行),但它是很難找到的來源(不是MonoTouch但是.NET專用)的錯誤,因爲存在沒有保證關於Default的值可以是什麼。

MSDN報價:

不同的計算機可以使用不同的編碼作爲默認,默認編碼甚至可以在一臺計算機上更改。

第二個因素是iOS模擬器是:一個模擬器不是模擬器。這有很多好處(例如它比Android模擬器快得多),但它也有缺點(很少有IMO,但它只會讓它們難以發現)。

這意味着當使用通用目的API(如獲取默認代碼頁)時,模擬器不會嘗試(很多)隱藏底層操作系統(即OSX)。由於它返回一個不同的值,所以System.Text.Encoding.Default將用不同的代碼頁進行初始化,導致使用不同的實現。

同樣如此設置您自己的編碼WebClient.Encoding是解決您的問題(對於任何.NET應用程序)的正確(並且安全)的方法。

3

我聽到Xamarin支持團隊的回覆,他們還建議明確設置WebClient編碼。

在我的設備上,WebClient.Encoding設置爲System.Text.Encoding.ASCII而不是UTF8,它用於iOS Simulator

還沒一個通用的解決方案,但至少你可以使用高級DownloadString

using (var client = new WebClient()) 
{ 
    client.Encoding = System.Text.Encoding.UTF8; 
    var response = client.DownloadString("http://dl.dropbox.com/u/58977881/umlautTest.txt"); 
} 
+0

嗨,我是一名iOS開發人員,面臨與您發佈相同的編碼問題。請參閱此帖http://stackoverflow.com/questions/9891510/arabic-characters-issue。我不知道什麼關於C#,.NET等,但在服務器端,我們正在使用C#。我相信你有一些技巧可以解決這個問題。期待您的評論 – rakeshNS 2012-04-04 12:39:03