转载

Objective-C 对二进制数据 NSData 进行 URL 编码

Objective-C 和其它所谓的 Unicode 友好型编程语言, 大多对内存不友好, 这些语言一提到"二进制", 好像就当机了一样.

所以, 我认为 PHP 确实是最好的编程语言, 对于 PHP 来说, 字符串就是二进制, 二进制就是字符串, 不管你什么字符集. 这并不是说 PHP 支持 Unicode, 事实上, PHP 对 Unicode 的支持是最友好最高级的. 例如, 拿到一段内存, 你想把它当作为 UTF-8 或者 UTF-16, 随你意, 只要你认为它是什么, 它就是什么, 然后, PHP 提供了对应的函数来处理.

回到题目, 在 Objective-C 里, 要将一段二进制数据(也就是一段内存)进行 urlencode(URL 编码), 应该怎么做? 很不幸, CFURLCreateStringByAddingPercentEscapes() 函数只处理字符串. 没错, 又是字符串! 这就是不把字符串当二进制的坏处!

所以, 只能自己写一个函数.

static int is_safe_char(char c){     if(c == '.' || c == '-' || c == '_'){         return 1;     }else if(c >= '0' && c <= '9'){         return 1;     }else if(c >= 'A' && c <= 'Z'){         return 1;     }else if(c >= 'a' && c <= 'z'){         return 1;     }     return 0; }  static NSString *urlencode_data(NSData *data){     NSMutableString *ret = [[NSMutableString alloc] init];     char *ptr = (char *)data.bytes;     int len = (int)data.length;     for(int i=0; i<len; i++){         char c = ptr[i];         if(is_safe_char(c)){             [ret appendFormat:@"%c", c];         }else{             [ret appendFormat:@"%%%02X", c];         }     }     return ret; }
原文  http://www.ideawu.net/blog/archives/928.html
正文到此结束
Loading...