パスワードに特殊な文字があるIOSはどのようにIOSのURLに中国語のパラメータが含まれている問題を処理します

2078 ワード

urlは26文字の英字、数字、および少数の特殊文字をサポートするため、urlに標準url以外の文字が含まれている場合は符号化する必要があります.iOSでは、関数stringByAddingPercentEscapesUsingEncodingが中国語といくつかの特殊文字を符号化していますが、stringByAddingPercentEscapesUsingEncodingの機能は完全ではなく、いくつかの特殊な文字に対して無効です.
 
NSStringに中国語文字が含まれていればNSURLに変換して得られる値はnilであり、stringByAddingPercentEscapesUsingEncoding:NSUTF 8 StringEncodingで解決できる.コードは以下の通りである.
NSString *str = [NSString stringWithUTF8String:surl.c_str()];   str = @"http://218.21.213.10/MobileOA/TIFF/鄂安弁公室は45日、2012年の全市安全生産相対制御指標の下達に関する通知を出した.jpg";   str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];   NSURL *imageUrl = [NSURL URLWithString:str];   UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]]; 
中間にstr=[str stringByAddingPercentEscapesUsingEncoding:NSUTF 8 StringEncoding];この行はimageUrlがnil
 
例えばリクエスト」http://m.xxx.com/login.action?username=liyong&psw=&123&time=20120723「このようなurlリクエストの場合、その中のパスワード部分には特殊文字"&123"が含まれているため、urlは分割パラメータのフラグとみなされ、パラメータは誤って次のように分割されます.
username=liyong,psw=空,123=空,time=20120723
 
解決策:
 
そのため、特殊文字のパスワードを正しく渡すには、パスワードについて次のような処理が必要です.
 
password = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef) password,NULL,(CFStringRef) @"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8);
 
注意:このようなencodingはparamsの内容に対してしかできません.url全体に対してこのようにしないでください.
このときパスワードは「&123」です.「&」が「&」に変換されるので、特殊文字付きのパスワードを渡すことができます.
 
注:ASIHttpRequestを使っています.
 
それをカプセル化し,完全なurl符号化関数を提供する.
 
NSString* encodeURL(NSString* dString ){   NSString* escapedUrlString= (NSString*) CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)dString, NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );   escapedUrlString = [escapedUrlString stringByAddingPercentEscapesUsingEncoding:kCFStringEncodingUTF8];
  return [escapedUrlString autorelease]; }

 
特に、encodeURLはurl内のcomponent符号化にのみ使用でき、url全体を符号化するには使用できません.