【问题标题】:Different kind of UTF8 decoding in NSStringNSString 中不同类型的 UTF8 解码
【发布时间】:2011-07-27 14:56:34
【问题描述】:

我已经搜索了很多关于 UTF8 解码的信息,但还没有找到答案。

我从我的 NSXMLParser 收到一个 UTF-8 解码的 NSString:

NSString *tempString = @"Test message readability is óké";

不知何故,我找不到将这个编码文本更改为:

Test message readability is óké

我可以说出我尝试过的所有选项,但我认为这没有必要。可以帮忙吗?

谢谢!

【问题讨论】:

    标签: iphone objective-c utf-8 nsstring


    【解决方案1】:

    NSXMLParser 将使用 XML 指定的字符编码处理文本。我相信在你的情况下,XML 没有明确指定 UTF-8。

    文本似乎是 ISO Latin 1。如果您无法对生成 XML 的服务器做任何事情,那么您可以应用此 hack:

    char* tempString = [string cStringUsingEncoding:NSISOLatin1StringEncoding];
    string = [NSString stringWithUTF8String:tempString];
    

    我已经通过在 GDB 提示符下进行测试来验证它是否有效:

    po [NSString stringWithUTF8String:(char*)[@"Test message readability is óké" cStringUsingEncoding:5]]
    

    【讨论】:

    • 成功了,谢谢! Xcode 警告我使用 'const char*' 而不是 'char'。我想这不会给我任何内存泄漏?我不习惯使用 char。但如果我理解你的话,你是说 XML 文件没有以正确的方式保存为 UTF-8,对吧?
    • 这里没有泄漏,添加const 是正确的做法。是的,我相信服务器要么没有指定使用什么字符编码,要么指定了错误的编码。
    • 奇怪的是,当我创建一个自己的 xml 文件通过 php 回显它时,在我的浏览器中它显示正确的字符,在 Objective-c 中它确实更改为错误的字符...
    • 你在文档头部使用<?xml version="1.0" encoding="utf-8" ?>xml声明吗?
    【解决方案2】:

    你做错了。你想要的是:

    char *s = "Test message readability is óké";
    //Note: this is a one-byte-character C string, not an NSString!
    NSString *tempString = [NSString stringWithCString:s encoding:NSUTF8StringEncoding];
    

    还请记住,当您初始化字符串常量时,实际进入程序内存的内容取决于当前文件的编码。如果它已经是 UTF-8,那么字符将被双重编码 - 您将在 C 字符串中将字符 Ã、³ 等编码为 UTF8。

    换句话说,使用字符串常量可能是一个错误的开始。请为问题提供更多背景信息。

    【讨论】:

    • 感谢您的回复。我收到声明 encoding="UTF-8" 的 XML。其中一个元素包含一个带有 é 和 à 等字符的字符串。但是当我在浏览器中打开 XML 时,我已经找到了这些 óké 字符。问题是:当我以 UTF-8 重新打开 TextWrangler(textEditor 应用程序)中的文本时,它会显示正确的字符,我是否以 Windows Latin 1 重新打开它,它给了我 óké。哦,你的例子不起作用,我已经试过了!
    • 如果 XML 是 UTF8 格式,那么以 Windows Latin 1 格式打开它会给你错误的字符,这是意料之中的。问题是,您首先要在代码中 完成什么?从字符串字面量(直接或通过 C 字符串)初始化 NSString 并不等同于 NSXMLParser 给你的东西——还有一个额外的编码层,即源文件编码。
    • 我从其他人那里得到一个显示错误字符的 XML 文件:解析时在我的 xml 中出现 óké。在浏览器中打开 XML url 时,我看到相同的“错误”字符。有没有办法将字符串或加载的 XMLString 转换为正确的字符?
    • 我的第一个想法是xml文件没有保存为UTF-8,而是在标头中声明为UTF8,导致字符错误
    【解决方案3】:

    这样的标准编码和解码:

    对于编码:

    NSString *content =  [bodyTextView.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    

    解码:

    NSString *decodedString = [msg.content stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2020-04-09
      相关资源
      最近更新 更多