1

我正在使用NSXMLParser将 XML 解析到我的应用程序并遇到编码类型问题。例如,这是进来的其中一个提要。它看起来类似于“

\U2026Some random text from the xml feed\U2026

我目前正在使用编码类型:

NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

我想使用哪种编码类型将 \U2026 转换为椭圆(...)?

4

3 回答 3

1

这里的答案是你搞砸了。他们对 XML 使用非标准编码,但如果他们真的想要文字\U2026怎么办?假设您添加了一个解码器来处理所有\UXXXX\uXXXX编码。当另一个提要希望数据是文字时会发生什么\U2026

您是首选,最好的办法是修复此提要。如果他们需要对数据进行编码,他们需要使用适当的 HTML 实体或数字引用。

作为后备,我会将解码器与 XML 解析器隔离开来。不要仅仅因为你得到不合格的数据就创建不合格的 XML 解析器。有一个只能在有问题的提要上运行的后处理器。


如果你必须有一个解码器,那么还有更多的坏消息。没有内置解码器,您需要在线查找类别或自己编写一个。


经过一番摸索,我认为使用 Objective C/Cocoa 来取消转义 unicode 字符,即 \u1234可能对你有用。

于 2012-06-13T21:49:15.153 回答
1

好的,这是一段适用于任何 unicode 代码点的代码片段:

NSString *stringByUnescapingUnicodeSymbols(NSString *input)
{
    NSMutableString *output = [NSMutableString stringWithCapacity:[input length]];

    // get the UTF8 string for this string...
    const char *UTF8Str = [input UTF8String];

    while (*UTF8Str) {
        if (*UTF8Str == '\\' && tolower(*(UTF8Str + 1)) == 'u')
        {
            // skip the next 2 chars '\' and 'u'
            UTF8Str += 2;

            // make sure we only read 4 chars
            char tmp[5] = { UTF8Str[0], UTF8Str[1], UTF8Str[2], UTF8Str[3], 0 };
            long unicode = strtol(tmp, NULL, 16); // remember that Unicode is base 16

            [output appendFormat:@"%C", unicode];

            // move on with the string (making sure we dont miss the end of the string
            for (int i = 0; i < 4; i++) {
                if (*UTF8Str == 0)
                    break;
                UTF8Str++;
            }
        }
        else 
        {
            if (*UTF8Str == 0)
                break;

            [output appendFormat:@"%c", *UTF8Str];
        }


        UTF8Str++;
    }

    return output;
}
于 2012-06-13T21:51:23.840 回答
0

您应该简单地替换引号上的文字 '\U2026',然后使用 NSUTF8StringEncoding encodind 将其编码为 NSData

于 2012-06-13T21:28:52.203 回答