【问题标题】:Convert UTF-8 encoding to ISO 8859-1 encoding with NSString使用 NSString 将 UTF-8 编码转换为 ISO 8859-1 编码
【发布时间】: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 的变体都可能失败。

标签: ios cocoa cocoa-touch character-encoding nsstring


【解决方案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”,这显然是错误的.
        猜你喜欢
        • 1970-01-01
        • 2011-07-26
        • 2010-12-27
        • 1970-01-01
        • 2015-04-11
        • 1970-01-01
        • 2016-10-04
        • 2010-12-19
        • 2020-06-13
        相关资源
        最近更新 更多