NSString из NSData с символом: 

Как я могу вернуться к NSString из даты байта NSString, содержащей этот символ: fl?

NSString *inflatedString01  = @"fl";

// original code that was the problem!
NSData *dataOfString = [NSData dataWithBytes:[inflatedString01 UTF8String] length:[inflatedString length]];
// code that fixes the problem
//NSData *dataOfString = [inflatedString01 dataUsingEncoding:NSUTF8StringEncoding]; //thanks zneak

NSLog(@"%@",inflatedString01);
NSLog(@"%i",[inflatedString01 length]);
NSLog(@"%@",dataOfString);
NSLog(@"%i",[dataOfString length]);

NSString *stringFromData = [NSString stringWithCString:[dataOfString bytes] encoding:NSUTF8StringEncoding]

NSLog(@"%@",stringFromData);

Вывод выше дает:

2012-01-02 08:47:48.963 TestApp[74363:fe03] fl
2012-01-02 08:47:49.262 TestApp[74363:fe03] 1
2012-01-02 08:47:49.540 TestApp[74363:fe03] <ef>
2012-01-02 08:47:49.924 TestApp[74363:fe03] 1
2012-01-02 08:47:50.787 TestApp[74363:fe03] (null)

Я хотел бы видеть  вместо (null) для последнего вывода NSLog. Я предполагаю, что есть значение с выходом 'ef' NSData.


person Vamos    schedule 02.01.2012    source источник
comment
На самом деле, я думаю, что понял, я попробовал: NSData *dataOfString = [NSData dataWithBytes:[inflatedString01 UTF8String] length:strlen([inflatedString01 UTF8String])]; который получил правильную длину строковых байтовых данных (я думаю!)   -  person Vamos    schedule 02.01.2012


Ответы (1)


Проблема заключается в несоответствии размера символа размеру двоичного файла. Когда вы вызываете [NSString length], вы получаете количество логических символов в строке, а не количество байтов, необходимых для ее хранения в произвольной кодировке. Символ  является одним логическим символом для класса NSString, но его кодировка UTF-8 — ef ac 82: он занимает 3 байта.

Ваш вызов [NSData dataWithBytes:length:] получает указатель на эти 3 байта, но затем [inflatedString01 length] сообщает, что это только один символ, и вы передаете его как количество байтов; вот почему ваши данные содержат только ef.

strlen, не зная кодировки, будет просто подсчитывать количество байтов в строке C, пока не найдет ноль, поэтому он точно вернет количество байтов в строке UTF-8 (как вы отметили в своем комментарии).

Лучшим решением, вероятно, будет просто вызвать [inflatedString01 dataUsingEncoding:NSUTF8StringEncoding] для получения байтов.

person zneak    schedule 02.01.2012
comment
Спасибо за объяснение zneak, приму через 5 минут :-) - person Vamos; 02.01.2012
comment
@Rew, нет проблем :) также рассмотрите возможность использования -[NSString dataUsingEncoding:] для получения байтов. - person zneak; 02.01.2012
comment
Конечно, я обновлю вопрос для других, он попал туда из-за того, что я пробовал все и вся (всегда помогает узнать, что вы делаете :-)) - person Vamos; 02.01.2012
comment
Я думаю, вы имели в виду +[NSString stringWithCString:encoding:]; в любом случае спасибо за помощь! - person Vamos; 02.01.2012
comment
@Rew, и Mac OS, и iOS имеют -[NSString dataUsingEncoding:]. - person zneak; 02.01.2012