У меня есть UTF-8, закодированный NSData
с сервера Windows, и я хочу преобразовать его NSString
для iPhone. Поскольку данные содержат символы (например, символы степени), которые имеют разные значения на обеих платформах, как преобразовать данные в строку?
567
Ответы:
Если данные не заканчиваются нулем, вы должны использовать
-initWithData:encoding:
Если данные заканчиваются нулем, вы должны вместо этого использовать,
-stringWithUTF8String:
чтобы избежать лишних\0
в конце.(Обратите внимание, что если вход неправильно закодирован в UTF-8, вы получите
nil
.)Свифт вариант:
Если данные заканчиваются нулем, вы можете пойти безопасным путем - удалить этот нулевой символ или небезопасным способом, аналогичным версии Objective C выше.
источник
Вы можете вызвать этот метод
источник
NSData
знает, сколько у него байтов ...NSData
кNSString
(см. Ответ KennyTM), я удивлен, что нет,+(id)stringWithUTF8Data:(NSData *)data
который просто работает.Я смиренно отправляю категорию, чтобы сделать это менее раздражающим:
а также
(Обратите внимание, что если вы не используете ARC, вам понадобится
autorelease
там.)Теперь вместо ужасающе многословного:
Ты можешь сделать:
источник
Версия Swift от String до Data и обратно до String:
Xcode 10.1 • Swift 4.2.1
Игровая площадка
источник
Иногда методы в других ответах не работают. В моем случае я генерирую подпись с моим закрытым ключом RSA, и в результате получается NSData. Я обнаружил, что это похоже на работу:
Objective-C
стриж
источник
[[NSData alloc] initWithBase64EncodedString:signatureString options:0]
; Свифт :NSData(base64EncodedString: str options: nil)
Чтобы подвести итог, вот полный ответ, который работал для меня.
Моя проблема была в том, что когда я использовал
Строка, которую я получил, была непредсказуемой: около 70% она содержала ожидаемое значение, но слишком часто это приводило к чему-то
Null
или даже хуже: искаженное в конце строки.После некоторых копаний я переключился на
И каждый раз получал ожидаемый результат.
источник
С Swift 5, вы можете использовать
String
«sinit(data:encoding:)
инициализатор для того , чтобы преобразоватьData
экземпляр вString
случае с использованием UTF-8.init(data:encoding:)
имеет следующую декларацию:Следующий код Playground показывает, как его использовать:
источник