// 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:))
19
你可以调用这个方法
+(id)stringWithUTF8String:(const char *)bytes.
15
我谦卑地提交一个类别,以减少烦恼:
@interface NSData (EasyUTF8)
// Safely decode the bytes into a UTF8 string
- (NSString *)asUTF8String;
@end
extension Data {
var string: String {
return String(data: self, encoding: .utf8) ?? ""
}
}
extension String {
var data: Data {
return Data(utf8)
}
var base64Decoded: Data? {
return Data(base64Encoded: self)
}
}
Playground
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) // "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"
6 回答
如果数据不是以null结尾,则应使用
-initWithData:encoding:
如果数据以空值终止,则应使用
-stringWithUTF8String:
来避免结尾处的额外\0
.(注意,如果输入没有正确的UTF-8编码,你将得到
nil
. )Swift变种:
如果数据以空值终止,您可以通过删除该空字符的安全方式或类似于上述Objective-C版本的不安全方式 .
你可以调用这个方法
我谦卑地提交一个类别,以减少烦恼:
和
(注意,如果你需要
autorelease
那么 . )而不是令人震惊的冗长:
你可以做:
Swift版本从String到Data再返回String:
Xcode 9 • Swift 4
Playground
有时,其他答案中的方法不起作用 . 在我的情况下,我使用我的RSA私钥生成签名,结果是NSData . 我发现这似乎有效:
Objective-C
Swift
总结一下,这是一个完整的答案,对我有用 .
我的问题是我用的时候
我得到的字符串是不可预测的:大约70%它确实包含了预期的值,但是它经常导致
Null
甚至更糟:在字符串的末尾打扮 .经过一番挖掘后,我转而去了
每次都得到预期的结果 .