Iphone 非标准编码字符的解码
我正在尝试解码从URL编码的服务器发送的一些文本,这是我找到的最好的方法 我使用以下标准函数进行URL编码:Iphone 非标准编码字符的解码,iphone,objective-c,ios,urlencode,Iphone,Objective C,Ios,Urlencode,我正在尝试解码从URL编码的服务器发送的一些文本,这是我找到的最好的方法 我使用以下标准函数进行URL编码: NSString* encodeToPercentEscapeString(NSString *string) { return (__bridge NSString *) CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge CFSt
NSString* encodeToPercentEscapeString(NSString *string) {
return (__bridge NSString *)
CFURLCreateStringByAddingPercentEscapes(NULL,
(__bridge CFStringRef) string,
NULL,
(CFStringRef) @"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
}
NSString* decodeFromPercentEscapeString(NSString *string) {
return (__bridge NSString *)
CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL,
(__bridge CFStringRef) string,
CFSTR(""),
kCFStringEncodingUTF8);
}
如果我对特殊字符进行编码:
NSString* encoded = encodeToPercentEscapeString(@"ąśżźćęółń");
我得到@“%C4%85%C5%9B%C5%BC%C5%BA%C4%87%C4%99%C3%B3%C5%82%C5%84”
没关系
但如果我尝试解码它:
NSString* original = decodeFromPercentEscapeString(encoded);
我得到:@“徖徖徖徖徖徖徖徖徖徖徖徖徖徖√≥ŇŇĄ”
为什么?
有没有更好的方法来解码URL编码的文本?您是否尝试过
-[NSString stringByReplacingPercentEscapesUsingEncoding:
此外,您正在错误地使用桥接强制转换。创建的字符串将泄漏,因为ARC不知道它拥有这些字符串。使用CfBrigingRelease()。这是很好的,因为它是CfReLasee()的一个变体,它通常需要平衡一个核心基础“创建”函数,但是它与ARC协作。p> 您是否尝试过
-[NSString stringByReplacingPercentEscapesUsingEncoding:][/code>
此外,您正在错误地使用桥接强制转换。创建的字符串将泄漏,因为ARC不知道它拥有这些字符串。使用CfBrigingRelease()。这是很好的,因为它是CfReLasee()的一个变体,它通常需要平衡一个核心基础“创建”函数,但是它与ARC协作。p> 是的,我有。同样的事情也会发生。不过,谢谢你给我关于桥的提示。我想肯定还有其他问题。Python中的快速测试(仅使用编码字符串)显示了正确的输出:$Python>>>来自CoreFoundation import*>>>cfurlCreateStringByReplacingPercentesEscapesusingEncoding(无,u”%C4%85%C5%9B%C5%BC%C5%BA%C4%87%C4%99%C3%B3%C5%82%C5%84“,u”,kCFStringEncodingUTF8)。编码('utf8')“\xc4\x85\xc5\x9b\xc5\xbc\xc5\xba\xc4\x87\xc4\x99\xc3\xb3\xc5\x82\xc5\x84”是的,但由于某些原因,似乎应该作为一个字符处理的字节对被视为两个。这意味着在您的问题中\xc4\x85翻译为Ö而不是ą,您可以用“我得到”来描述结果。你怎么知道的?我只是拿了你的代码并进行了测试,一切都很好。我使用NSLog()
检查结果。我删除了ARC isms,因为我在Snow Leopard上使用了Xcode 3.2.6,但仅此而已。我也使用了NSLog,但在Xcode 4.3.2和Lion上使用了5.1。我开始认为这可能是我的ios/devtools版本中的一个bug。同样的事情也会发生。不过,谢谢你给我关于桥的提示。我想肯定还有其他问题。Python中的快速测试(仅使用编码字符串)显示了正确的输出:$Python>>>来自CoreFoundation import*>>>cfurlCreateStringByReplacingPercentesEscapesusingEncoding(无,u”%C4%85%C5%9B%C5%BC%C5%BA%C4%87%C4%99%C3%B3%C5%82%C5%84“,u”,kCFStringEncodingUTF8)。编码('utf8')“\xc4\x85\xc5\x9b\xc5\xbc\xc5\xba\xc4\x87\xc4\x99\xc3\xb3\xc5\x82\xc5\x84”是的,但由于某些原因,似乎应该作为一个字符处理的字节对被视为两个。这意味着在您的问题中\xc4\x85翻译为Ö而不是ą,您可以用“我得到”来描述结果。你怎么知道的?我只是拿了你的代码并进行了测试,一切都很好。我使用NSLog()
检查结果。我删除了ARC isms,因为我在Snow Leopard上使用了Xcode 3.2.6,但仅此而已。我也使用了NSLog,但在Xcode 4.3.2和Lion上使用了5.1。我开始认为这可能是我的ios/devtools版本中的一个bug。