我從Windows服務器有UTF-8編碼的NSData
,我想將它轉換爲iPhone的NSString
。 因爲數據包含在兩個平臺上具備不一樣值的字符(如度數符號), 如何將數據轉換爲字符串? 安全
我謙卑地提交一個類別,以減小煩惱: 服務器
@interface NSData (EasyUTF8) // Safely decode the bytes into a UTF8 string - (NSString *)asUTF8String; @end
和 ide
@implementation NSData (EasyUTF8) - (NSString *)asUTF8String { return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding]; } @end
(請注意,若是您不使用ARC,則須要在那裏進行autorelease
。) 編碼
而不是使人震驚的冗長: spa
NSData *data = ... [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
你能夠作: code
NSData *data = ... [data asUTF8String];
有時,其餘答案中的方法不起做用。 在個人狀況下,我使用個人RSA私鑰生成簽名,結果是NSData。 我發現這彷佛有效: 字符串
Objective-C的 string
NSData *signature; NSString *signatureString = [signature base64EncodedStringWithOptions:0];
迅速 it
let signatureString = signature.base64EncodedStringWithOptions(nil)
若是數據不是以null結尾,則應使用-initWithData:encoding:
io
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
若是數據以空值終止,則應使用-stringWithUTF8String:
以免結尾處的額外\\0
。
NSString* newStr = [NSString stringWithUTF8String:[theData bytes]];
(注意,若是輸入沒有正確的UTF-8編碼,你將獲得nil
。)
let newStr = String(data: data, encoding: .utf8) // note that `newStr` is a `String?`, not a `String`.
若是數據以空值終止,您能夠經過刪除該空字符的安全方式或相似於上述Objective-C版本的不安全方式。
// safe way, provided data is \0-terminated let newStr1 = String(data: data.subdata(in: 0 ..< data.count - 1), encoding: .utf8) // unsafe way, provided data is \0-terminated let newStr2 = data.withUnsafeBytes(String.init(utf8String:))
你能夠調用這個方法
+(id)stringWithUTF8String:(const char *)bytes.
Swift版本從String到Data再返回String:
Xcode 10.1•Swift 4.2.1
extension Data { var string: String? { return String(data: self, encoding: .utf8) } }
extension StringProtocol { var data: Data { return Data(utf8) } }
extension String { var base64Decoded: Data? { return Data(base64Encoded: self) } }
操場
let string = "Hello World" // "Hello World" let stringData = string.data // 11 bytes let base64EncodedString = stringData.base64EncodedString() // "SGVsbG8gV29ybGQ=" let stringFromData = stringData.string // "Hello World"
let base64String = "SGVsbG8gV29ybGQ=" if let data = base64String.base64Decoded { print(data) // 11 bytes print(data.base64EncodedString()) // "SGVsbG8gV29ybGQ=" print(data.string ?? "nil") // "Hello World" }
let stringWithAccent = "Olá Mundo" // "Olá Mundo" print(stringWithAccent.count) // "9" let stringWithAccentData = stringWithAccent.data // "10 bytes" note: an extra byte for the acute accent let stringWithAccentFromData = stringWithAccentData.string // "Olá Mundo\n"