2012-03-11 47 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