Javascript Hex Escaped String返回到Cocoa App而没有Escaped Characters

时间:2010-11-30 16:32:11

标签: javascript iphone objective-c cocoa uiwebview

我正在开发的iPhone应用程序的一部分是使用 UIWebView 来获取页面上某些元素的 onclick 事件。出现的一个问题是某些页面,例如iPhone版http://news.google.com,页面已经十六进制转义链接,如下所示:

javascript:window.open('/news/url?sa\x3dt\x26ct3\x3dMAA4CEgAUABgAWoCdXN6AWjYAQE\x26usg\x3dAFQjCNGUV1AFw0LsmkcQzNnvo69ma_dhhA\x26rt\x3dHOMEPAGE\x26url\x3dhttp://www.cnn.com/2010/US/11/30/wikileaks/?hpt%3DSbin');void(0);  

当我使用以下方法从 UIWebView 接收函数时:

[webView stringByEvaluatingJavaScriptFromString:
                     [NSString stringWithFormat:@"SomeFunction(%i,%i);",(NSInteger)pt.x,(NSInteger)pt.y]]  

我收到一个字符串,其中包含转义字符作为实际字符。所以我从上面的方法收到了带有十六进制转义符的javascript调用,而不是:

javascript:window.open('/news/url?sa=t&ct3=MAA4CEgAUABgAWoCdXN6AWjYAQE&usg=AFQjCNGUV1AFw0LsmkcQzNnvo69ma_dhhA&rt=HOMEPAGE&url=http://www.cnn.com/2010/US/11/30/wikileaks/?hpt%3DSbin');void(0);  

我尝试了各种在Javascript中转义字符串的方法,例如转义百分比和URIEncoding / URIDecoding,但它似乎不起作用,只是继续发送转义字符串而不是实际字符。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

如果将“\ x”转义符替换为“\ u00”转义符,则可以使用CFStringTransform

NSMutableString* js = [ [webView stringByEvaluatingJavaScriptFromString:
                                   [NSString stringWithFormat:
                                               @"SomeFunction(%i,%i);",
                                               (NSInteger)pt.x,(NSInteger)pt.y]
                         ] mutableCopy];
[js replaceOccurrencesOfString:@"\\x" 
                    withString:@"\\u00" 
                       options:NSCaseInsensitiveSearch 
                         range:NSMakeRange(0, [js length])];
CFStringTransform((CFMutableStringRef)js,
                  NULL, 
                  (CFStringRef)@"Any-Hex/Java", 
                  true);

我不确定哪个iOS版本支持“Any-Hex / Java”transliterator。另外,上面的内容不能正确处理一些字符串;在“x”之前具有偶数个反斜杠的任何子串将被错误地解码。