Enz*_*ran 6 javascript iphone ascii escaping objective-c
我有一串ASCII字符(由[NSString stringWithFormat:@"%c",someNumber]随机创建),我想使用该字符串作为javascript方法的输入.就像是:
[webView_ stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"my_javascript_method(\"%@\")", myASCIIString]];
Run Code Online (Sandbox Code Playgroud)
我怎样才能逃脱NSString?我试着研究encodeURI和decodeURI,但还没有找到任何解决方案.
zet*_*ang 13
NSJSONSerialization
就在拐角处.要将NSString转义为Javascript字符串文字是很难的,可能很容易做错.(JSONKit
使用代码行来处理它https://github.com/johnezang/JSONKit/blob/82157634ca0ca5b6a4a67a194dd11f15d9b72835/JSONKit.m#L1423)
下面是一个逃避NSString
对象的小类别方法.
#import "NSString+JavascriptEscape.h"
@implementation NSString (JavascriptEscape)
- (NSString *)stringEscapedForJavasacript {
// valid JSON object need to be an array or dictionary
NSArray* arrayForEncoding = @[self];
NSString* jsonString = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:arrayForEncoding options:0 error:nil] encoding:NSUTF8StringEncoding];
NSString* escapedString = [jsonString substringWithRange:NSMakeRange(2, jsonString.length - 4)];
return escapedString;
}
@end
Run Code Online (Sandbox Code Playgroud)
另外,有一点需要注意,你必须在javascript函数的参数中使用双引号.例如,
NSString *javascriptCall =
[NSString stringWithFormat:@"MyJavascriptFunction(\"%@\")", escapedString];
[self.webView stringByEvaluatingJavaScriptFromString:javascriptCall];
Run Code Online (Sandbox Code Playgroud)
AlB*_*ebe 10
经过无数个小时研究解决方案,我想出了什么.结果我遇到了一个问题,我没有逃离回车\ r \n所以这个功能解决了我的问题.
-(NSString *)addBackslashes:(NSString *)string {
/*
Escape characters so we can pass a string via stringByEvaluatingJavaScriptFromString
*/
// Escape the characters
string = [string stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
string = [string stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
string = [string stringByReplacingOccurrencesOfString:@"\'" withString:@"\\\'"];
string = [string stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
string = [string stringByReplacingOccurrencesOfString:@"\r" withString:@"\\r"];
string = [string stringByReplacingOccurrencesOfString:@"\f" withString:@"\\f"];
return string;
}
Run Code Online (Sandbox Code Playgroud)
这是一个很棒的网站,我找到了这个解决方案.http://www.wilsonmar.com/1eschars.htm
通过ASCII,我认为你的意思是它是0x00到0x7F范围内的一个字节.在此范围内,根据http://www.json.org唯一的字符,你需要逃脱是\
,"
和控制字符:0x00-0x1F到0x7f.如果你正在进行简单的替换,控制字符会有点棘手,所以我会逐字逐句地去掉字符串,也许就是这样(没有经过测试):
const char *chars = [myASCIIString UTF8String];
NSMutableString *escapedString = [NSMutableString string];
while (*chars)
{
if (*chars == '\\')
[escapedString appendString:@"\\\\"];
else if (*chars == '"')
[escapedString appendString:@"\\\""];
else if (*chars < 0x1F || *chars == 0x7F)
[escapedString appendFormat:@"\\u%04X", (int)*chars];
else
[escapedString appendFormat:@"%c", *chars];
++chars;
}
NSString *js = [NSString stringWithFormat:@"my_js_function(\"%@\")", escapedString];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7460 次 |
最近记录: |