問題分析
在javascript ES6中,String多了一個方法String.raw``,詳見http://docs.w3cub.com/javascript/global_objects/string/raw/。String.raw``可以把一個普通的字符串轉(zhuǎn)為Raw String。
舉個栗子,字符串"\abc",是3個字符構(gòu)成,分別是'\a','b','c',通過String.raw``后,可以變成4個字符:'\','a','b','c',也就是把字符串中的'\'表示其本身,而不是轉(zhuǎn)義符。也就是把"\abc"轉(zhuǎn)變成了"\\abc"。
但是在iOS中沒有String.raw``類似的方法,而且在iOS9以下UIWebView/WKWebView中,不支持ES6語法,沒辦法使用String.raw``,所以只能通過原生轉(zhuǎn)換。那么在iOS中如何轉(zhuǎn)換呢?
最容易想到的是通過替換,把"\"替換成"\\"不就行了?思路是對的,但是替換不了,因為"\"不是一個單獨的字符,"\a"才是一個字符。
那么把"\a"替換成"\\a"呢?貌似是可以的,但是前提是得知道"\"后面的字符。在實際中,很多情況是不知道"\"后面的字符的,或者知道但是字符特別多,都不好處理。
這里提供一種方法可以完成轉(zhuǎn)換,就是通過escape編碼。
實現(xiàn)過程
對原字符串escape編碼——替換——escape解碼
例如字符串"\abc",首先進行escape編碼,編碼方法請點擊,編碼后的字符串為"%5Cabc"。和原字符串相比可以發(fā)現(xiàn),"\"變成了"%5C",其他的沒有變化。是的,"\"不再是轉(zhuǎn)義符,而變成了普通字符串,那么就可以對"%5C"進行替換了。如下所示
NSString *str = @"%5Cabc";
[str stringByReplacingOccurrencesOfString:@"%5C" withString:@"%5C%5C"];
這時候變?yōu)?%5C%5Cabc",最后再對str進行escape解碼:
str = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
那么,字符串str就變成"\\abc"了,相當于完成了Raw String的轉(zhuǎn)變。