除Json字符串外粥航,常用的特殊字符串處理。
特殊情況舉例
當我要向H5
發(fā)送數(shù)據(jù)時:
NSString *message = @"<section>'這是一段測試文字'</section>";
NSString *jsText = [NSString stringWithFormat:@"setContents('%@')", message];
[self.webView evaluateJavaScript:jsText completionHandler:^(id _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
} else {
NSLog(@"%@",error);
}
}];
此時會發(fā)生JavaScript
異常
是因為需要傳值的字符串中和JavaScript
的中的單引號沖突瓣铣,H5
無法識別,此時我們需要對這類的字符串進行轉(zhuǎn)義操作。
轉(zhuǎn)義
手動查找并轉(zhuǎn)義
一般情況下Objective-C
里
英文單引號正常可以寫成@"'"
英文雙引號正呈蘸粒可以寫成@"""
但是,普通字符串的轉(zhuǎn)義是無法像JSON
那樣去轉(zhuǎn)義的殷勘,所以就需要替換字符串此再。
踩坑
找到需要轉(zhuǎn)義的'
或"
,分別替換為\\'
或\\"
玲销。
此處必須寫成雙反斜杠输拇,不然編譯器或者系統(tǒng)會認為此處是轉(zhuǎn)義,會自動去掉單反斜杠贤斜。
正確的寫法:
NSString *message = @"<section>\\'這是一段測試文字\\'</section>";
錯誤的寫法:
NSString *message = @"<section>\'這是一段測試文字\'</section>";
上面是手動轉(zhuǎn)義策吠,是直接在文本上進行轉(zhuǎn)義。
代碼轉(zhuǎn)義
普通文本中可能存在多個特殊字符瘩绒,此時需要遍歷字符串猴抹,查找每個字符進行匹配后修改。
NSString *specialString = @"'";
NSString *replaceText = @"\\'";
NSMutableString *message = [[NSMutableString alloc] initWithString:@"<section>'這是一段測試文字'</section><section>'這是一段測試文字'</section><section>'這是一段測試文字'</section>"];
// 判斷message中是否包含單引號
if ([message localizedStandardContainsString:specialString]) { // 效果等同于[message containsString:specialString]
// 遍歷所有字符串
[message enumerateSubstringsInRange:NSMakeRange(0, message.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
if ([substring isEqualToString:specialString]) {
// 轉(zhuǎn)義特殊字符串
[message replaceOccurrencesOfString:substring withString:replaceText options:NSLiteralSearch range:enclosingRange];
}
}];
}
完整的示例代碼:
NSString *specialString = @"'";
NSString *replaceText = @"\\'";
NSMutableString *message = [[NSMutableString alloc] initWithString:@"<section>'這是一段測試文字'</section><section>'這是一段測試文字'</section><section>'這是一段測試文字'</section>"];
// 判斷message中是否包含單引號
if ([message localizedStandardContainsString:specialString]) { // 效果等同于[message containsString:specialString]
// 遍歷所有字符串
[message enumerateSubstringsInRange:NSMakeRange(0, message.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
if ([substring isEqualToString:specialString]) {
// 轉(zhuǎn)義特殊字符串
[message replaceOccurrencesOfString:substring withString:replaceText options:NSLiteralSearch range:enclosingRange];
}
}];
}
NSString *jsText = [NSString stringWithFormat:@"setContents('%@')", message];
[self.webView evaluateJavaScript:jsText completionHandler:^(id _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
} else {
NSLog(@"%@",response);
}
}];
展示最終結(jié)果