使用 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】:你可以使用NSString
的getCString: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 编码的主要内容,如果未能解决你的问题,请参考以下文章