我遇到的问题WebClient
表现不同
发布版本在真实设备上比在iOS模拟器的调试模式下构建。
显然,来自服务器的响应会得到不同的解释,并且在发布版本中会中断:
This question似乎有一个类似问题的答案,但我不想在应用程序中对编码进行硬编码,即使它的生命周期可能没有变化,这样做似乎是错误的信息已包含在HTTP response
。
我已经向Xamarin提出了进一步调查的问题。
答案 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");
}