我正在使用NSXMLParser
将 XML 解析到我的应用程序并遇到编码类型问题。例如,这是进来的其中一个提要。它看起来类似于“
\U2026Some random text from the xml feed\U2026
我目前正在使用编码类型:
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
我想使用哪种编码类型将 \U2026 转换为椭圆(...)?
我正在使用NSXMLParser
将 XML 解析到我的应用程序并遇到编码类型问题。例如,这是进来的其中一个提要。它看起来类似于“
\U2026Some random text from the xml feed\U2026
我目前正在使用编码类型:
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
我想使用哪种编码类型将 \U2026 转换为椭圆(...)?
这里的答案是你搞砸了。他们对 XML 使用非标准编码,但如果他们真的想要文字\U2026
怎么办?假设您添加了一个解码器来处理所有\UXXXX
和\uXXXX
编码。当另一个提要希望数据是文字时会发生什么\U2026
?
您是首选,最好的办法是修复此提要。如果他们需要对数据进行编码,他们需要使用适当的 HTML 实体或数字引用。
作为后备,我会将解码器与 XML 解析器隔离开来。不要仅仅因为你得到不合格的数据就创建不合格的 XML 解析器。有一个只能在有问题的提要上运行的后处理器。
如果你必须有一个解码器,那么还有更多的坏消息。没有内置解码器,您需要在线查找类别或自己编写一个。
经过一番摸索,我认为使用 Objective C/Cocoa 来取消转义 unicode 字符,即 \u1234可能对你有用。
好的,这是一段适用于任何 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;
}
您应该简单地替换引号上的文字 '\U2026',然后使用 NSUTF8StringEncoding encodind 将其编码为 NSData