2012-01-18 71 views
1

我明白为什么当从NSData到NSString你需要指定编码。 但是我发现令人沮丧的是如何反向(NSString到NSData)需要来指定一个编码。NSString NSData编码考虑

在这种使用相关 NSUTF8StringEncodingdefaultCStringEncoding,后者没有得到充分解释question答案建议。

所以我只想问,如果转换的NSString时的NSData以下是正确的:

  • 在你想成为100%肯定的NSString对象的二进制表示UTF8然后使用情况NSUTF8StringEncoding(或任何编码需要)

  • 在其中的NSString对象的编码是已知的/预期已经是特定类型的情况下,不转换是必需的,然后它的安全(或许内部更快)使用d efaultCStringEncoding(从我读过的Objective-C采用UTF-16内部,不知道是否LE或BE但我认为LE因为平台是LE)

TIA

回答

3

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

NSData对象是绝对原始字节的字符串的包装。如果NSString没有指定某种编码,它不知道该写什么,因为在1和0的级别上,UTF-16编码看起来与同一个字母的UTF-8编码不同,当然,如果您将UTF-16编写为big-endian并将其作为little-endian阅读,则会得到乱码。

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

至于你的问题......这是我的两分钱。如果你正在将一个NSString转换为一个NSData,以便你的同一个程序可以稍后将它转换回来,并且在你将它读回NSString之前,没有其他软件需要处理这个NSData,那么这些都不重要。重要的是你的字符串到数据编码和你的数据到字符串编码匹配。 2)如果你只处理ASCII字符,你可能会逃脱很多,只是因为多种编码对128以下的字符使用相同的表示方式。但是这很容易破坏,即使是像智能引号。

3)尽管名称,defaultCStringEncoding不是你应该使用的默认值。它专为需要处理系统字符串并且不知道系统如何处理其内部字符串的特殊情况而设计。它指的是在默认的C实现中处理字符串的方式,而不是在NSString内部进行处理,所以不一定有性能优势。4)如果你编写一个字符串时使用了未知的字符串编码,并且你尝试用不同的字符串编码读取它,那么你的代码将失败;在很多情况下,你最终会得到一个空字符串。

底线是:谁会试图解释你的NSData对象?如果它是您自己的应用程序,请选择一种对您有意义的编码(我对所有内容都使用UTF8)并将其用于两种转换。否则,请确定您的生态系统需要读取或写入的内容,并制定您的标准。