我正在尝试通过网络从字节a创建一个字符串。 NSString我总是一个空的。
if (stringLength > 0) {
NSData *bytes = [[NSData alloc] initWithBytes:data+1 length:stringLength];
result = [[NSString alloc] initWithData:bytes encoding:NSUTF8StringEncoding];
//result = [[NSString alloc] initWithBytes:data+1 length:stringLength encoding:NSASCIIStringEncoding];
}
正如我所说,我得到一个空的NSString。该字符串是base64编码的值,因此它应该是有效的utf-8,因为它只包含ascii符号。
答案 0 :(得分:0)
毕竟,你的原始字节可能不是UTF-8。或者,因为您正在传递data+1
而不是data
本身,所以您导致编码尝试失败,因为该进程认为存在不正确的UTF-8编码序列。 (请原谅我,如果我是冒昧,但你必须考虑到所有因素。)无论如何,你在很大程度上依赖于你的假设,这是一个偶然陷入困境的陷阱。
这是适合你的策略。如果您尝试使用NSUTF8StringEncoding
创建NSString实例,则返回nil,然后尝试使用NSISOLatin1StringEncoding
。如果返回nil,则尝试使用NSMacOSRomanStringEncoding
。
即使在所有这些之后,你得到一个不太正确的字符串,它仍然比一个零字符串好,因为它可以帮助向你显示是否存在其他一些你犯了错误的区域。 / p>
祝你工作顺利。
答案 1 :(得分:0)
检查它是否真的是base64编码..
CFErrorRef error = NULL;
CFDataRef decodedData;
SecTransformRef decoder;
decoder = SecDecodeTransformCreate(kSecBase64Encoding, &error);
if (error) {
CFShow(error);
exit(-1);
}
SecTransformSetAttribute(decoder,
kSecTransformInputAttributeName,
(CFDataRef *)bytes,
&error);
if (error) {
CFShow(error);
exit(-1);
}
decodedData = SecTransformExecute(decoder, &error);
if (error) {
CFShow(error);
exit(-1);
}