Objective C - 带有umlaut的char转换为NSString

4

我正在使用libical,这是一个解析icalendar格式(RFC 2445)的库。
问题在于,位置字段中可能会有一些德语umlauts。
现在,libical为每个值返回const char *,例如:

"K\303\203\302\274nstlerhaus in M\303\203\302\274nchen"  

我尝试使用以下方法将其转换为NSString:

[NSString stringWithCString:icalvalue_as_ical_string_r(value) encoding:NSUTF8StringEncoding];

但我得到的是:
Künstlerhaus in München

有什么建议吗?我会感激任何帮助!
2个回答

6
似乎您的字符串被双重UTF-8编码了,因为“Künstlerhaus in München”实际上是UTF-8,如果您再次对其进行UTF-8解码,应该会得到正确的字符串。请注意,您不应该满足于此结果。有些组合是无法通过双重UTF-8解码来简单解码双重UTF-8编码的字符串的。一些编码组合是不可逆的。所以在您的情况下,我建议您找出为什么首先将字符串双重UTF-8编码,可能是ical在硬盘上存储时使用了错误的编码,或者libical使用了错误的字符集来访问它,或者如果您从服务器获取ical,那么text/ical的字符集可能是错误的,等等...

"Künstlerhaus in München" 解码为 utf-8 后变成 "Künstlerhaus in München"。 - vakio
啊,好的,谢谢。你能给我一个NSString解码的例子吗? - Alexander
NSString *string1 = [NSString stringWithCString:"Künstlerhaus in München" encoding:NSUTF8StringEncoding];NSString *string2 = [NSString stringWithCString:[string1 cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];但是正如我之前所说的,你真的不应该这样做,这很丑陋。 - Thomas Wana

0

这个 C 字符串似乎没有使用 UTF-8 编码,因为每个字符都有四个字节。例如,ü 在 UTF-8 中的编码应该是 \xc3\xbc(或者 \195\188)。所以,输入要么在你接收到它时已经损坏了,要么使用了其他编码。


好的,那我该怎么办?有没有使用上述字符的已知编码? - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接