私はNSString
このようなものを持っています:
http://www.
しかし、私はそれを次のように変換したい:
http%3A%2F%2Fwww.
これどうやってするの?
私はNSString
このようなものを持っています:
http://www.
しかし、私はそれを次のように変換したい:
http%3A%2F%2Fwww.
これどうやってするの?
必要な文字をエスケープするには、もう少し作業が必要です。
サンプルコード
iOS7以降:
NSString *unescaped = @"http://www";
NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
NSLog(@"escapedString: %@", escapedString);
NSLog 出力:
エスケープ文字列: http%3A%2F%2Fwww
以下は、有用な URL エンコード文字セットです。
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
上記のすべてを組み合わせた文字セットの作成:
NSCharacterSet *URLCombinedCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@" \"#%/:<>?@[\\]^`{|}"] invertedSet];
Base64 の作成
Base64 文字セットの場合:
NSCharacterSet *URLBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"/+=\n"] invertedSet];
スウィフト 3.0 の場合:
var escapedString = originalString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)
Swift 2.x の場合:
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
注:stringByAddingPercentEncodingWithAllowedCharacters
エンコーディングが必要な UTF-8 文字もエンコードします。
iOS7 より前の Core Foundation
を使用 Core Foundation を ARC で使用:
NSString *escapedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef) unescaped,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]\" "),
kCFStringEncodingUTF8));
Core Foundation を ARC なしで使用する:
NSString *escapedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)unescaped,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]\" "),
kCFStringEncodingUTF8);
注:-stringByAddingPercentEscapesUsingEncoding
は正しいエンコーディングを生成しません。この場合、同じ文字列を返すものは何もエンコードしません。
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding
14 文字をエンコードします。
`#%^{}[]|\"<> に加えて、パーセント エスケープされたスペース文字。
テスト文字列:
" `~!@#$%^&*()_+-={}[]|\\:;\"'<,>.?/AZaz"
エンコードされた文字列:
"%20%60~!@%23$%25%5E&*()_+-=%7B%7D%5B%5D%7C%5C:;%22'%3C,%3E.?/AZaz"
注: この文字セットがニーズを満たしているかどうかを検討し、そうでない場合は必要に応じて変更してください。
エンコードが必要な RFC 3986 文字 (エンコードのプレフィックス文字であるため、% が追加されます):
"!#$&'()*+,/:;=?@[]%"
一部の「予約されていない文字」は、追加でエンコードされます。
"\n\r \"%-.<>\^_`{|}~"
これはURL エンコーディングと呼ばれます。詳細はこちら。
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
CFStringConvertNSStringEncodingToEncoding(encoding));
}
これは私の解決策ではありません。他の誰かがstackoverflowに書きましたが、方法を忘れました。
どういうわけか、このソリューションは「うまく」機能します。発音区別記号、漢字、およびその他のほとんどすべてを処理します。
- (NSString *) URLEncodedString {
NSMutableString * output = [NSMutableString string];
const char * source = [self UTF8String];
int sourceLen = strlen(source);
for (int i = 0; i < sourceLen; ++i) {
const unsigned char thisChar = (const unsigned char)source[i];
if (false && thisChar == ' '){
[output appendString:@"+"];
} else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
(thisChar >= 'a' && thisChar <= 'z') ||
(thisChar >= 'A' && thisChar <= 'Z') ||
(thisChar >= '0' && thisChar <= '9')) {
[output appendFormat:@"%c", thisChar];
} else {
[output appendFormat:@"%%%02X", thisChar];
}
}
return output;
}
誰かがこのコードを書いた人を教えてくれたら、本当に感謝します。基本的に、このエンコードされた文字列が希望どおりに正確にデコードされる理由について、彼はいくつかの説明を持っています。
私は彼の解決策を少し修正しました。スペースは + ではなく %20 で表すのが好きです。それで全部です。
NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NUL,(CFStringRef)@"parameter",NULL,(CFStringRef)@"!*'();@&+$,/?%#[]~=_-.:",kCFStringEncodingUTF8 );
NSURL * url = [[NSURL alloc] initWithString:[@"address here" stringByAppendingFormat:@"?cid=%@",encodedString, nil]];
スウィフト iOS:
参考までに:私はこれを使用しました:
extension String {
func urlEncode() -> CFString {
return CFURLCreateStringByAddingPercentEscapes(
nil,
self,
nil,
"!*'();:@&=+$,/?%#[]",
CFStringBuiltInEncodings.UTF8.rawValue
)
}
}// end extension String
NSString *str = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)yourString,
NULL,
CFSTR("/:"),
kCFStringEncodingUTF8);
自分で解放または自動解放する必要がありstr
ます。
//次のようなNSStringインスタンスメソッドを使用します:
+ (NSString *)encodeURIComponent:(NSString *)string
{
NSString *s = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}
+ (NSString *)decodeURIComponent:(NSString *)string
{
NSString *s = [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}
要求するすべてのURLではなく、パラメータ値に対してのみエンコードまたはデコードする必要があることを忘れないでください。
int strLength = 0;
NSString *urlStr = @"http://www";
NSLog(@" urlStr : %@", urlStr );
NSMutableString *mutableUrlStr = [urlStr mutableCopy];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
strLength = [mutableUrlStr length];
[mutableUrlStr replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:NSMakeRange(0, strLength)];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
strLength = [mutableUrlStr length];
[mutableUrlStr replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:NSMakeRange(0, strLength)];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );