[iOS]通過JS調用iOS函數時的URL編碼問題

來源:互聯網
上載者:User

在前面的文章:[iOS]在WebApp中如何使用JS調用iOS的函數 中,提到了如何使用JS通過修改URL調用iOS的內建函式。


其中會遇到一個問題,就是編碼問題,比如通過URL調用彈窗,在裡面寫上內容:你好汪海。


那連結大概就是這樣的:http://xxx.com#ios?action=alert&param=你好汪海


但是在iOS中接收到的時候會出現中文的亂碼:

http://xxx.com#ios?action=alert&param=%25E6%2596%2587%25E4

遇到這個問題主要是URL在轉化中的編碼問題,解決方案感謝這篇博文:iOS中的編碼問題。


將轉碼函數封裝:

// 將URL編碼- (NSString *)encodeToPercentEscapeString: (NSString *) input{    NSString *outputStr = (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,                                            (CFStringRef)input,                                            NULL,                                            (CFStringRef)@"!*'();:@&=+$,/?%#[]",                                            kCFStringEncodingUTF8));    return outputStr;}// 將URL解碼- (NSString *)decodeFromPercentEscapeString: (NSString *) input{    NSMutableString *outputStr = [NSMutableString stringWithString:input];    [outputStr replaceOccurrencesOfString:@"+"                               withString:@" "                                  options:NSLiteralSearch                                    range:NSMakeRange(0, [outputStr length])];        return [outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];}


示範一下上面的封裝函數:

    NSString * testUrl = @"http://search.google.com?keywords=($# it's {a*123})00!*'();:@&=+$,/?%#[]";    NSLog(@"original: %@", testUrl);    NSString * encodeStr = [self encodeToPercentEscapeString:testUrl];    NSLog(@"encoded: %@", encodeStr);        NSString * encodeStr2 = [testUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];    NSLog(@"encoded2:%@", encodeStr2);        NSString * decodeStr = [self decodeFromPercentEscapeString:encodeStr];    NSLog(@"decoded: %@", decodeStr);



結果如下:

>> original: http://search.google.com?keywords=($# it's {a*123})00!*'();:@&=+$,/?%#[]
>> encoded: http%3A%2F%2Fsearch.google.com%3Fkeywords%3D%28%24%23%20it%27s%20%7Ba%2A123%7D%2900%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D
>> encoded2: http://search.google.com?keywords=($%23%20it's%20%7Ba*123%7D)00!*'();:@&=+$,/?%25%23%5B%5D
>> decoded: http://search.google.com?keywords=($# it's {a*123})00!*'();:@&=+$,/?%#[]




示範一下內建的URL轉碼測試代碼:

  NSString* string1 = @"https://www.cloudsafe.com/檔案夾";        NSString* string2 = [string1 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];        NSString* string3 = [string2 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];        NSString* string4 = [string2 stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];        NSString* string5 = [string3 stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];        NSString* string6 = [string4 stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];        NSString* string7 = [string5 stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];            NSLog(@"未經處理資料%@",string1);    NSLog(@"一層編碼%@",string2);    NSLog(@"兩層編碼%@",string3);    NSLog(@"一層編碼的一層解碼%@",string4);    NSLog(@"兩層編碼的一層解碼%@",string5);    NSLog(@"一層編碼的兩層解碼%@",string6);    NSLog(@"兩層編碼的兩層解碼%@",string7);    



列印結果:

2014-06-10 15:00:02.425 DareWayApp[7400:671651] 未經處理資料https://www.cloudsafe.com/檔案夾

2014-06-10 15:00:02.426 DareWayApp[7400:671651] 一層編碼https://www.cloudsafe.com/%E6%96%87%E4%BB%B6%E5%A4%B9

2014-06-10 15:00:02.427 DareWayApp[7400:671651] 兩層編碼https://www.cloudsafe.com/%25E6%2596%2587%25E4%25BB%25B6%25E5%25A4%25B9

2014-06-10 15:00:02.427 DareWayApp[7400:671651] 一層編碼的一層解碼https://www.cloudsafe.com/檔案夾

2014-06-10 15:00:02.427 DareWayApp[7400:671651] 兩層編碼的一層解碼https://www.cloudsafe.com/%E6%96%87%E4%BB%B6%E5%A4%B9

2014-06-10 15:00:02.427 DareWayApp[7400:671651] 一層編碼的兩層解碼https://www.cloudsafe.com/檔案夾

2014-06-10 15:00:02.427 DareWayApp[7400:671651] 兩層編碼的兩層解碼https://www.cloudsafe.com/檔案夾





如果伺服器用的是GBK編碼,只要把上面的UTF改成下面的encoding就可以了:

 NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);        urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:gbkEncoding];      



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.