我一直在WebClient
上遇到问题, 版本在真实设备上的版本不同于iOS模拟器的调试模式。在MonoTouch中构建发布版本时WebClient编码问题
显然是从服务器的响应得到不同的解释,并在释放断裂构造:
This question似乎有一个类似的问题的答案,但我不想硬编码的编码即使应用程序在其生命周期中可能没有更改,但由于信息已包含在HTTP response
中,因此似乎是错误的。
我已经打开了一个问题与Xamarin进一步调查。
我一直在WebClient
上遇到问题, 版本在真实设备上的版本不同于iOS模拟器的调试模式。在MonoTouch中构建发布版本时WebClient编码问题
显然是从服务器的响应得到不同的解释,并在释放断裂构造:
This question似乎有一个类似的问题的答案,但我不想硬编码的编码即使应用程序在其生命周期中可能没有更改,但由于信息已包含在HTTP response
中,因此似乎是错误的。
我已经打开了一个问题与Xamarin进一步调查。
有在这里打球两个因素。第一:
似乎错了也这样做的信息都已经包含在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应用程序)的正确(并且安全)的方法。
我听到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");
}
嗨,我是一名iOS开发人员,面临与您发布相同的编码问题。请参阅此帖http://stackoverflow.com/questions/9891510/arabic-characters-issue。我不知道什么关于C#,.NET等,但在服务器端,我们正在使用C#。我相信你有一些技巧可以解决这个问题。期待您的评论 – rakeshNS 2012-04-04 12:39:03