我从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"