Encoding NSString到NSData编码注意事项

Encoding NSString到NSData编码注意事项,encoding,nsstring,nsdata,Encoding,Nsstring,Nsdata,我理解为什么从NSData转换为NSString时需要指定编码。 然而,我发现反向(NSString到NSData)需要指定编码的方式令人沮丧 在这篇相关文章中,答案建议使用 NSUTF8StringEncoding或defaultCStringEncoding,后者未得到充分解释 因此,我只想问一下,将NSString转换为NSData时,以下内容是否正确: 如果希望100%确保NSString对象的二进制表示为UTF8,则使用NSUTF8StringEncoding(或任何需要的编码) 如

我理解为什么从NSData转换为NSString时需要指定编码。 然而,我发现反向(NSString到NSData)需要指定编码的方式令人沮丧

在这篇相关文章中,答案建议使用 NSUTF8StringEncodingdefaultCStringEncoding,后者未得到充分解释

因此,我只想问一下,将NSString转换为NSData时,以下内容是否正确:

  • 如果希望100%确保NSString对象的二进制表示为UTF8,则使用NSUTF8StringEncoding(或任何需要的编码)

  • 如果已知/预期NSString对象的编码已经是某种类型,并且不需要转换,那么使用defaultCStringEncoding(据我所知,objective-c在内部使用UTF-16,不确定是LE还是BE,但我会假设LE,因为平台是LE)


TIA将NSString转换为NSData时需要指定编码,原因与从NSData转换为NSString时需要指定编码相同

NSData对象是绝对原始字节字符串的包装器。如果NSString没有指定某种编码,它就不知道该写什么,因为在1和0的级别上,UTF-16编码看起来不同于同一个字母的UTF-8编码,当然,如果您将UTF-16写为大端,而将其读为小端,那么您将我会胡言乱语的

换句话说,不要将其视为转换或转义字符串;生成一个字节缓冲区,编码告诉它下一个字符是“a”时要写入哪些1和0,当它表示“a”时要写入哪些1和0妈".

至于你的问题……这是我的两分钱

1) 如果您正在将NSString转换为NSData,以便同一程序稍后可以将其转换回,并且在您将其读回NSString之前,其他软件不需要处理该NSData,那么这些都不重要。重要的是字符串到数据编码和数据到字符串编码匹配

2) 如果你只处理ASCII字符,你可能会逃脱很多惩罚,因为许多类型的编码对128以下的字符使用相同的表示法。但这很容易打破,即使是使用智能引号之类的小东西

3) 尽管名称不同,defaultCStringEncoding并不是您应该使用的默认值。它是为特殊情况而设计的,您需要处理系统字符串,并且不知道系统如何处理其内部字符串。它指的是在默认C实现中处理字符串的方式,而不是在NSString intern中als,因此不一定有性能优势

4) 如果您使用未知的字符串编码编写字符串,并尝试使用不同的字符串编码将其读回,那么您的代码将失败;在许多情况下,您最终将得到一个空字符串

底线是:谁将试图解释你的NSData对象?如果这是你自己的应用程序,选择一种对你有意义的编码(我对所有东西都使用UTF8),并将其用于两种转换。否则,请找出你的生态系统需要读或写什么,并将其作为你的标准