NSString из NSData с символом: fl - PullRequest
       35

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

0 голосов
/ 02 января 2012

Как я могу вернуться к 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)

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

1 Ответ

2 голосов
/ 02 января 2012

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

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

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

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

...