使用 NSString 将 UTF-8 编码转换为 ISO 8859-1 编码

Posted

技术标签:

【中文标题】使用 NSString 将 UTF-8 编码转换为 ISO 8859-1 编码【英文标题】:Convert UTF-8 encoding to ISO 8859-1 encoding with NSString 【发布时间】:2010-12-29 10:45:28 【问题描述】:

我有一个应用程序可以从服务器读取 UTF-8 格式的数据,但它必须以 ISO 8859-1(Latin-1) 格式显示。是否有任何 Cocoa API 来实现这一点?

【问题讨论】:

“在 ISO 8859-1 中显示”没有意义。如果显示文本,则会绘制字符。并且字符独立于编码。存储或传输文本时使用编码,但不显示。 @user543101 我回答的哪一部分没有充分回答您的问题? 我同意 Codo,这毫无意义。采用 ISO-8859-1 编码的字符并将它们序列化为 UTF-8 只是可以的,因为 ISO-8895-1 被合并为前 256 个代码点,但是这将与任何其他编码一起失败,并且如果你不是真的可能会失败使用 ISO-8859-1(例如,使用 8859-15 或 Windows-1252)。服务器应该发送正确的 UTF-8 编码的 Unicode 代码点,您应该只显示相关的字形。 @Jason 虽然问题的动机可能没有意义,但仍然有答案。 @Jacob 这个问题是另一个问题的系统性问题,需要指出的是,该解决方案仅适用于 8859-1。以这种方式序列化的任何其他编码,甚至 8859-1 的变体都可能失败。 【参考方案1】:

你可以使用NSStringgetCString:maxLength:encoding:方法,像这样:

char converted[([string length] + 1)];
[string getCString:converted maxLength:([string length] + 1) encoding: NSISOLatin1StringEncoding];

NSLog(@"%s", converted);

一旦你有了这个,你就可以使用stringWithCString:encoding:类方法从相同的编码重新初始化一个NSString实例:

NSString *converted_str = [NSString stringWithCString:converted encoding:NSISOLatin1StringEncoding];

【讨论】:

【参考方案2】:

我更喜欢使用dataUsingEncoding:allowLossyConversion:,因为它不需要您猜测要分配多少存储空间,并且返回的 NSData 会告诉您需要多少字节。

【讨论】:

【参考方案3】:

Jacobs 的回答并没有真正适合我。最终对我有用的是只使用

[username stringByAddingPercentEscapesUsingEncoding:NSISOLatin1StringEncoding]

【讨论】:

【参考方案4】:

使用

+ (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc

例子:

latinStringForDisplay = [NSString stringWithCString:yourCstringHere encoding:NSISOLatin1StringEncoding];

应该可以的。

【讨论】:

这个函数从 latin1 缓冲区生成 NSString :) 作者询问反向操作。 @Evgen:该函数要求一个 C 字符串 yourCstringHere,并输出一个带有拉丁编码的 NSSring,而不是来自拉丁缓冲区,如您所引用的那样:“...make NSString from latin1 缓冲区 :)" 谢谢:-) 它没有。你的代码是说 C 字符串是用 ISO-8859-1 编码的,你想要一个 NSString。因此,如果他将字符串“åhus”编码为 UTF-8,但从 latin-1 开始,他将有一个字节流,例如:C3 A5 68 75 73,而您的方法将生成 NSString:“Ã¥hus”,这显然是错误的.

以上是关于使用 NSString 将 UTF-8 编码转换为 ISO 8859-1 编码的主要内容,如果未能解决你的问题,请参考以下文章

将 UTF-8 编码的 NSData 转换为 NSString

我如何将NSString转换为UTF-8以外的编码?

iOS NSString 转换编码格式ISO-8859-1

iOS NSString 转换编码格式ISO-8859-1

在不编码的情况下将 NSData 转换为 NSString

如何将二进制数据转换为 NSstring?