Проблема кодировки WebClient в MonoTouch при сборке для выпуска - PullRequest
3 голосов
/ 11 марта 2012

У меня были проблемы с WebClient, который ведет себя по-разному в сборках релизов на реальных устройствах по сравнению с симулятором iOS в режиме отладки.

Очевидно, что ответ сервера интерпретируется по-разному, и в сборках релизов возникают перерывы:Screenshot from the DEBUG build running in the iOS Simulator Screenshot from the RELEASE build running on an iPhone 4S

На этот вопрос , похоже, есть ответ на аналогичную проблему, но я не хочу жестко кодировать кодировку в приложении, даже если она может не изменитьсяв своей жизни это кажется неправильным, поскольку информация уже содержится в HTTP response.

Я уже открыл проблему с Xamarin для дальнейшего изучения этого вопроса.

Ответы [ 2 ]

4 голосов
/ 12 марта 2012

Здесь есть два фактора. Во-первых:

кажется, что это неправильно, поскольку информация уже содержится в ответе HTTP

Да, он выглядит неправильно, но WebClient.Encoding в Microsoft .NET по умолчанию идентичен System.Text.Encoding.Default .

MSDN цитата:

Значением по умолчанию для этого свойства является кодировка, возвращаемая по умолчанию.

Как таковая реализация Mono (и MonoTouch) WebClient ведет себя идентично . Это часто упускается из виду (работает в большинстве случаев), но это источник трудно найти (не MonoTouch, но специфично для .NET) ошибок, поскольку нет гарантии о том, что Default значение может быть.

MSDN цитата:

Разные компьютеры могут использовать разные кодировки по умолчанию, и кодировка по умолчанию может даже измениться на одном компьютере.

Вторым фактором является симулятор iOS: симулятор не эмулятор. Это имеет много преимуществ (например, намного быстрее, чем эмуляторы Android), но также имеет свои недостатки (мало IMO, но это только затрудняет их поиск).

Это означает, что симулятор не пытается (сильно) скрывать базовую операционную систему (то есть OSX) при использовании общего целевого API, например, при получении кодовой страницы по умолчанию. Поскольку он возвращает другое значение, System.Text.Encoding.Default будет инициализирован с другой кодовой страницей, что приведет к использованию другой реализации.

Таким образом, установка собственной кодировки на WebClient.Encoding является правильным (и безопасным) способом решения вашей проблемы (для любого приложения .NET).

3 голосов
/ 12 марта 2012

Я получил ответ от службы поддержки 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");
}
...