问题分析
在javascript ES6中,String多了一个方法String.raw``,详见http://docs.w3cub.com/javascript/global_objects/string/raw/。String.raw``可以把一个普通的字符串转为Raw String。
举个栗子,字符串"\abc",是3个字符构成,分别是'\a','b','c',通过String.raw``后,可以变成4个字符:'\','a','b','c',也就是把字符串中的'\'表示其本身,而不是转义符。也就是把"\abc"转变成了"\\abc"。
但是在iOS中没有String.raw``类似的方法,而且在iOS9以下UIWebView/WKWebView中,不支持ES6语法,没办法使用String.raw``,所以只能通过原生转换。那么在iOS中如何转换呢?
最容易想到的是通过替换,把"\"替换成"\\"不就行了?思路是对的,但是替换不了,因为"\"不是一个单独的字符,"\a"才是一个字符。
那么把"\a"替换成"\\a"呢?貌似是可以的,但是前提是得知道"\"后面的字符。在实际中,很多情况是不知道"\"后面的字符的,或者知道但是字符特别多,都不好处理。
这里提供一种方法可以完成转换,就是通过escape编码。
实现过程
对原字符串escape编码——替换——escape解码
例如字符串"\abc",首先进行escape编码,编码方法请点击,编码后的字符串为"%5Cabc"。和原字符串相比可以发现,"\"变成了"%5C",其他的没有变化。是的,"\"不再是转义符,而变成了普通字符串,那么就可以对"%5C"进行替换了。如下所示
NSString *str = @"%5Cabc";
[str stringByReplacingOccurrencesOfString:@"%5C" withString:@"%5C%5C"];
这时候变为"%5C%5Cabc",最后再对str进行escape解码:
str = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
那么,字符串str就变成"\\abc"了,相当于完成了Raw String的转变。