NSString initWithData возвращает пустой указатель

Я вытягиваю данные из веб-сайта через NSURLConnection и прятание полученных данных в экземпляре NSMutableData. В connectionDidFinishLoading метод делегата данные является преобразованием в строку с вызовом к соответствующему методу NSSTRING:

NSString *result = [[NSString alloc] initWithData:data 
                                     encoding:NSUTF8StringEncoding]

Получившая строка оказывается пустым указателем. Если я использую NSASCIIStringEncoding, однако, я действительно получаю соответствующую строку, хотя с unicode символами, искаженными как ожидалось. Сервер Content-Type заголовок не указывает кодировку UTF-8, но я делал попытку многих различных веб-сайтов с подобным сценарием, и там преобразование строк происходит очень хорошо. Кажется, что проблема только принадлежит данному веб-сервису, но у меня нет подсказки почему.

На ноте стороны, вытягивает веб-страницы и данные из API хорошая практика, т.е. буферизует данные, преобразовывая в строку, и управляя строкой впоследствии?

Очень ценивший!

25
задан dmkc 14 August 2010 в 21:28
поделиться

3 ответа

Вы говорите, что это «определенно UTF-8», но без заголовка Content-Type вы на самом деле этого не знаете. (И даже если у вас есть заголовок, говорящий об этом, это все равно может быть неверным.)

Я предполагаю, что ваши данные обычно представляют собой ASCII, который всегда правильно анализирует как UTF-8, но вы иногда пытаетесь проанализировать данные, которые фактически закодированы в ISO 8859-1 или кодовой странице Windows 1252. Такие данные обычно будут в основном в формате ASCII, но с некоторыми байтами за пределами диапазона 0–127, определенного ASCII. UTF-8 ожидает, что такие байты будут формировать последовательность кодовых единиц в указанной последовательности диапазонов, но в других кодировках любой байт, независимо от значения, сам по себе является полным символом. Попытка интерпретировать данные, отличные от ASCII и не UTF-8, как UTF-8 почти всегда приведет либо к неверным результатам (неправильные символы), либо вообще без результатов (невозможно декодировать; декодер возвращает nil ), потому что данные никогда не кодировались в UTF-8.

Сначала вам следует попробовать UTF-8, а в случае неудачи использовать ISO 8859-1.Если вы позволяете пользователю извлекать любую веб-страницу, вы должны позволить ему изменить кодировку, которую вы используете для декодирования данных, на случай, если они обнаружат, что на самом деле это 8859-9, или codepage-1252, или другая 8-битная кодировка.

Если вы загружаете данные с определенного сервера, и особенно если вы влияете на то, что работает на этом сервере, вы должны сделать так, чтобы он выдавал точный заголовок Content-Type и / или исправить любую ошибку, из-за которой он обслуживать текст, которого нет в UTF-8.

27
ответ дан 28 November 2019 в 21:08
поделиться

Кодировка по умолчанию для HTTP, если ничего не указано, - ISO-8859-1. Если ответ HTTP соответствует HTTP / 1.1 и не определяет кодировку набора символов, это кодировка, которую он использует.

Попробуйте декодировать строку с помощью этого NSISOLatin1StringEncoding.

5
ответ дан 28 November 2019 в 21:08
поделиться

Данные могли быть в другой кодировке юникода, например UTF16, или в совершенно разных кодировках.

Существуют библиотеки, которые могут угадать кодировку, используемую в данных, но это должно быть последним средством. Если вы используете веб-сервис, то в документации к нему должно быть указано, какую кодировку он использует. Поищите ее или спросите у поставщика веб-службы, какую кодировку он использует. Если нет ни того, ни другого, попробуйте получить образец данных, определить кодировку и использовать ее в программе.

Попутно заметим, является ли хорошей практикой извлечение веб-страниц и данных из API, т.е. буферизация данных, преобразование в строку и последующее манипулирование строкой?

Это зависит от размера данных. Если он небольшой, то это вполне нормально. Если большой, то лучше работать с данными по частям.

3
ответ дан 28 November 2019 в 21:08
поделиться