【问题标题】:Objective C - char with umlaute to NSStringObjective C - 带有元音符号的字符到 NSString
【发布时间】:2012-02-10 10:24:45
【问题描述】:

我正在使用 libical,它是一个解析 icalendar 格式 (RFC 2445) 的库。
问题是,例如在位置字段中可能有一些德语变音符号。
现在 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

有什么建议吗?我将不胜感激!

【问题讨论】:

    标签: objective-c ios cocoa-touch diacritics libical


    【解决方案1】:

    似乎您的字符串进行了双重 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”。
    • 嗯,好的,谢谢,你能给我一个如何再次解码 NSString 的例子吗?
    • NSString *string1 = [NSString stringWithCString:"K\303\203\302\274nstlerhaus in M\303\203\302\274nchen" encoding:NSUTF8StringEncoding]; NSString *string2 = [NSString stringWithCString:[string1 cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding]; 但是就像我之前说的,你真的不应该这样做,这很丑陋。
    【解决方案2】:

    C 字符串似乎没有以 UTF-8 编码,因为每个字符有四个字节。例如,ü 将在 UTF-8 中编码为 \xc3\xbc(或 \195\188)。所以输入要么在你收到时已经乱码,要么使用了其他编码。

    【讨论】:

    • 好的,那我该怎么办?使用上面显示的字符的任何已知编码?
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2012-12-09
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多