NSString到NSData编码注意事项

NSString to NSData encoding considerations

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

在这个相关问题中,建议使用nsutf8stringEncoding或defaultCStringEncoding,后者没有得到充分解释。

所以我只想问一下,在将nsstring转换为nsdata时,以下内容是否正确:

  • 如果要100%确定nsstring对象的二进制表示形式是utf8,则使用nsutf8stringEncoding(或需要的任何编码)。

  • 如果nsstring对象的编码已知/预期已经是某种类型,并且不需要转换,那么使用defaultcstringencoding是安全的(可能是内部更快的),(根据我读到的内容,objective-c在内部使用utf-16,不确定le或be,但我假设le是因为平台是le)

蒂亚


要将nsstring转换为nsdata,需要指定编码,原因与从nsdata转换为nsstring时需要指定编码的原因相同。

nsdata对象是绝对原始字节字符串的包装器。如果nsstring没有指定某些编码,它就不知道要写什么,因为在1和0的级别上,utf-16编码看起来与同一个字母的utf-8编码不同,当然,如果将utf-16写为big endian并将其读作little endian,就会变得乱七八糟。

换句话说,不要把它看作是转换或转义一个字符串;它正在生成一个字节缓冲区,编码告诉它下一个字符是"A"时要写哪个1和0,当它表示"妈妈"时要写哪个1和0。

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

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

2)如果您只处理ASCII字符,那么您可能会摆脱很多问题,因为许多类型的编码对128以下的字符使用相同的表示。但这很容易被打破,即使有一些小的东西,如聪明的引语。

3)尽管有此名称,但默认的字符串编码不应作为默认值使用。它是为特殊情况而设计的,在这种情况下,您需要处理系统字符串,而不知道系统如何处理其内部字符串。它指的是在默认C实现中处理字符串的方式,而不是在nsstring内部处理字符串的方式,因此不一定有性能优势。

4)如果使用未知的字符串编码编写字符串,并尝试使用其他字符串编码将其读回来,则代码将失败;在许多情况下,最终只会得到一个空字符串。

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