NSUTF8StringEncoding неверно декодирует, как исправить?

Дело в следующем, у меян есть приложение, которое по сокетам получает NSData и сразу после этого инициализирует NSMutableString этой датой, с кодировкой NSUTF8StringEncoding. Много тестировал, вс] было хорошо, но когда я начиваю передовать другой текст (он чуть больше, но места в дате хватает) который даже так же закодирован, у меня NSMutableString просто инициализируется nil, не могу понять почему он не может правильно инициализировать строку, при других данных.
- (NSMutableString *) recv //Чтение строки из сокета
{
    NSMutableString *recvStr;

        len = [inputStream read:buf maxLength:2048];
        if(len > 0 && len < 2048)
        {
            NSMutableData* data=[[NSMutableData alloc] initWithBytes: (const void*)buf length: len];
            recvStr = [NSMutableString alloc];
            recvStr = [recvStr initWithData:data encoding: NSUTF8StringEncoding];
            
        }
    
    return recvStr;
}
  • Вопрос задан
  • 3630 просмотров
Пригласить эксперта
Ответы на вопрос 6
Flanker_4
@Flanker_4
Ну вот опять же, Вы привели всего лишь маааааленькую часть кода, и нам теперь сиди гадай, я вообще удивлен , что @corristo решил откликнуться :D

Если все остальное ок, как Вы говорите, то возможно проблема в buf? В нем точно выделяется нужный размер?
а еще вот сюда стоит заглянуть stackoverflow.com/questions/9701776/nsutf8stringen... мало ли, может там и правда не UTF (там есть пример кода, позволяющий посмотреть кодировку, и поддерживается ли она вообще)

You say that it “is definitely UTF-8”, but without a Content-Type header, you don't really know that. (And even if you did have a header saying that, it could still be wrong.)

My guess is that your data is usually ASCII, which always parses correctly as UTF-8, but you sometimes are trying to parse data that's actually encoded in ISO 8859-1 or Windows codepage 1252. Such data will generally be mostly ASCII, but with some bytes outside the 0–127 range ASCII defines. UTF-8 would expect such bytes to form a sequence of code units within a specified sequence of ranges, but in other encodings, any byte, regardless of value, is a complete character on its own. Trying to interpret non-ASCII non-UTF-8 data as UTF-8 will almost always get you either wrong results (wrong characters) or no results at all (cannot decode; decoder returns nil), because the data was never encoded in UTF-8 in the first place.

You should try UTF-8 first, and if it fails, use ISO 8859-1. If you're letting the user retrieve any web page, you should let them change the encoding you use to decode the data, in case they discover that it was actually 8859-9 or codepage-1252 or some other 8-bit encoding.

If you're downloading the data from a specific server, and especially if you have influence on what runs on that server, you should make it serve up an accurate Content-Type header and/or fix whatever bug is causing it to serve up text that isn't in UTF-8.

Из того же SO. Так что скорей всего у Вас не UTF
Ответ написан
Не разделяйте alloc и init, это может плохо кончиться
Ответ написан
Еще есть классный GCDAsyncSocket, попробуйте, вдруг окажется удобнее голых сокетов
Ответ написан
Комментировать
@Mr_Kibernetik
Если NSMutableString инициализируется в nil, то это значит, что процедура конвертации данных в кодировку NSUTF8StringEncoding не прошла успешно. Основной причиной неудачи может быть то, что входящие данные поступают не в формате UTF-8.
Исправить это можно так: выяснить кодировку поступающих данных и конвертировать с учетом правильной кодировки.
Хороший пример проверочного кода и вариантов кодировок указан в первом ответе на этой странице: stackoverflow.com/questions/9701776/nsutf8stringen...
Варианты проверки могут быть разные, но общий смысл один - выяснить в какой кодировке поступают данные.
Ответ написан
Комментировать
divbyzero
@divbyzero
А такой вариант работает корректно (разумеется если подставить вашу строку)?
NSString *str = @"string";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString *new_str = [NSString stringWithUTF8String:[data bytes]];
Ответ написан
Комментировать
Может выложите все-таки например на pastebin данные (в виде hex например), которые шлете?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы