NSString到NSData编码注意事项

时间:2012-01-18 22:34:12

标签: encoding nsstring nsdata

我理解为什么从NSData转到NSString时需要指定编码。 但是我发现反向(NSString到NSData)需要指定编码是令人沮丧的。

在此相关question中建议使用的答案 NSUTF8StringEncoding defaultCStringEncoding ,后者未完全解释。

所以我只是想在将NSString转换为NSData时问以下是否正确:

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

  • 如果NSString对象的编码已知/预期已经是某种类型并且不需要转换,那么使用 defaultCStringEncoding 是安全的(可能内部更快)(从我所读到的目标-c内部使用UTF-16,不确定LE或BE,但我假设LE,因为该平台是LE)

TIA

1 个答案:

答案 0 :(得分:3)

需要指定编码以将NSString转换为NSData,原因与从NSData到NSString需要指定的原因相同。

NSData对象是绝对原始字节字符串的包装器。如果NSString没有指定某些编码,它就不知道要写什么,因为在1和0的级别,UTF-16编码看起来与同一个字母的UTF-8编码不同,当然,如果你把UTF-16写成big-endian并把它读作little-endian你会得到胡言乱语。

换句话说,不要将其视为转换或转义字符串;它是生成一个字节缓冲区,并且编码告诉它当下一个字符是“a”时写入哪些0和0以及当它意味着“妈”时写入哪些。

关于你的问题......这是我的两分钱。

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

2)如果你只处理ASCII字符,你可能会侥幸逃脱,因为许多种类的编码对128以下的字符使用相同的表示。但这很容易破坏,即使是像智能引号这样的小东西也是如此

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

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

底线是:谁将试图解释您的NSData对象?如果它是您自己的应用程序,请选择对您有意义的编码(我将UTF8用于所有内容)并将其用于两次转换。否则,弄清楚您的生态系统需要阅读或编写的内容,并将其作为您的标准。