"NSString stringWithUTF8String:" слишком обидчив - PullRequest
3 голосов
/ 07 июня 2011

Я занимаюсь строковыми манипуляциями с использованием высокоуровневых функций Какао, таких как NSString и NSData, а не копаюсь до вещей уровня C, таких как работа с массивами char s.

Ради всего этого, +[NSString stringWithUTF8String:] иногда возвращает nil на очень хорошей строке, которая была создана с помощью -[NSString UTF8String]. Можно предположить, что это происходит, когда вход искажен. Вот пример неудачного ввода в шестнадцатеричном формате:

55 6B 66 51 35 59 4A 5C 6A 60 40 33 5F 45 58 60 9D 47 3F 6E 5E 
60 59 34 58 68 41 4B 61 4E 3F 41 46 00

и ASCII:

UkfQ5YJ\j`@3_EX`G?n^`Y4XhAKaN?AF

Это случайно сгенерированная строка для проверки моей подпрограммы.

char * buffer = [randomNSString UTF8String];
// .... doing things .... in the end, buffer is the same as before
NSString * result = [NSString stringWithUTF8String:buffer];
// yields nil

Редактировать: На всякий случай, если кто-то не понял неявный вопрос, он находится в режиме -v:

Почему [NSString stringWithUTF8String:] иногда возвращает nil для идеально сформированной строки UTF8?

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Walkytalky это правильно. Таким образом, 9d не является законным в utf8. байты utf8 с старшими битами 10 зарезервированы как символы продолжения, они никогда не появляются без префиксного символа с более чем одним начальным битом.

0 голосов
/ 07 июня 2011

Это что-то вроде удара в темноте, потому что у нас недостаточно информации для правильной диагностики проблемы.

Если randomNSString больше не существует в точке, где вы выделяете память для result, например, если она была освобождена в среде с подсчетом ссылок или собрана в среде GC, возможно, что buffer указывает на память, которая была освобождена, но еще не использована (что объясняет, почему она все та же).

Однако создание новой строки NSString требует выделения памяти и может использовать блок, на который указывает буфер, что будет означать, что ваша строка UTF8 будет зарезана внутренними компонентами новой строки NSString. Вы можете проверить эту теорию, зарегистрировав содержимое буфера после того, как не удалось создать result. Не используйте спецификатор %s, напечатайте шестнадцатеричные байты.

...