斯堪的纳维亚人物æ,ø,å错误地逃脱了

时间:2012-07-02 16:43:46

标签: objective-c macos utf8-decode

我的程序与其他国家/地区的服务器连接,并且经常需要处理包含外来字符的URL。在我们考虑诸如æøå之类的斯堪的纳维亚字符之前,这种方法很有效。当我收到一个URL时,我按如下方式对其进行解码:

-(NSString*)urlDECODE:(NSString*)string
{
    NSString*   s = [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    return (s)?s:string;
}

然而,这无法正确解码这些字符:

filename: æøåa.rtf
input: %C3%83%C2%A6%C3%83%C2%B8a%C3%8C%C2%8Aa.rtf
output: æøaÌa.rtf

编辑:这是编码功能:

NSString * URLEncode(NSString * url)
{
    NSString* out = nil;
    @try
    {
        NSLog(@"BEFORE=%@",url);
        out = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"AFTER=%@",out);
    }
    @catch (NSException * e)
    {
        NSLog(@"Encoding error: %@", e);
    }

return out;
}

1 个答案:

答案 0 :(得分:1)

您的原始网址似乎已经错误地以UTF-8编码。

"æøåa.rtf" == "\xc3\xa6\xc3\xb8a\xcc\x8aa.rtf"
               == "æ"      "ø"    "a\u030a" "a.rtf"  // in UTF-8
               == "æøåa.rtf"

请检查传递给URLEncode()的构造的NSString。您显示的其他代码是正确的(除了在Objective-C中处理异常很少)。