为JavaScript输入转义NSString

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


Dan*_*son 5

通过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)