构建发布时,MonoTouch中的WebClient编码问题

时间:2012-03-11 16:53:31

标签: .net ios mono xamarin.ios webclient

我遇到的问题WebClient表现不同 发布版本在真实设备上比在iOS模拟器的调试模式下构建。

显然,来自服务器的响应会得到不同的解释,并且在发布版本中会中断: 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提出了进一步调查的问题。

2 个答案:

答案 0 :(得分:4)

这里有两个因素在起作用。第一:

  

这样做似乎是错误的,因为信息已包含在HTTP响应中

是的,看起来错误,但Microsoft .NET的WebClient.Encoding默认情况下与System.Text.Encoding.Default相同。

MSDN引用:

  

此属性的默认值是Default返回的编码。

因此WebClient的Mono(和MonoTouch)实现与相同。这经常被忽视(当时的工作原理),但它是难以找到(不是MonoTouch但特定于.NET)错误的来源,因为没有保证关于什么{ {1}}值可以是。

MSDN引用:

  

不同的计算机可以使用不同的编码作为默认编码,默认编码甚至可以在一台计算机上更改。

第二个因素是iOS模拟器是:模拟器而不是模拟器。这有很多好处(例如它比Android模拟器快得多)但它也有它的缺点(很少有IMO,但只会让它们更难发现)。

这意味着模拟器在使用通用目的API时不会尝试(很多)隐藏底层操作系统(即OSX),例如获取默认代码页。由于它返回不同的值,Default将使用不同的代码页进行初始化,从而导致使用不同的实现。

因此将您自己的编码设置为System.Text.Encoding.Default是解决问题的正确(且安全)方式(适用于任何.NET应用程序)。

答案 1 :(得分: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");
}