【问题标题】:Javascript Hex Escaped String returned to Cocoa App without Escaped CharactersJavascript Hex Escaped String 返回到 Cocoa App,没有转义字符
【发布时间】:2010-11-30 16:32:11
【问题描述】:

我正在开发的 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,但它似乎不起作用,只是不断发送转义字符串而不是实际字符。

任何帮助将不胜感激!

【问题讨论】:

  • 等等,示例字符串 ("javascript:window.open...") 是从哪里来的?这是SomeFunction 应该返回的吗?
  • javascript:window.open 是 DOM 树中某个元素的 onclick 属性的一部分。它由SomeFunction 返回,但它当前将转义字符作为单个字符而不是它们应该表示的字符返回。

标签: javascript iphone objective-c cocoa uiwebview


【解决方案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" 之前带有偶数个反斜杠的子字符串都将被错误解码。

【讨论】:

  • Any-Hex/Java 在 iOS 4.0 上为我工作。我不确定它在早期版本上会如何工作。非常感谢!
  • 如果 4.0 支持它,我希望它可以在 3 上工作,甚至可能在 2 上工作,因为对 ICU 转换和“Any-Hex/Java”的支持同时添加到操作系统X. 不是说我会花钱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多