web-dev-qa-db-ja.com

ios9のstringByAddingPercentEscapesUsingEncodingに置き換わるもの

IOS8以前では、次のものを使用できます。

NSString *str = ...; // some URL
NSString *result = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

iOS9ではstringByAddingPercentEscapesUsingEncodingstringByAddingPercentEncodingWithAllowedCharactersに置き換えられました。

NSString *str = ...; // some URL
NSCharacterSet *set = ???; // where to find set for NSUTF8StringEncoding?
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];

そして私の質問です:NSCharacterSetの適切な置き換えのために必要なstringByAddingPercentEscapesUsingEncodingNSUTF8StringEncoding)をどこで見つけるべきか?

103
slavik

廃止予定のメッセージには、次のように記載されています(私の強調)。

代わりにstringByAddingPercentEncodingWithAllowedCharacters(_ :)を使用します。常に推奨されるUTF-8エンコード方式を使用します、および各URLコンポーネントまたはサブコンポーネントは有効な文字に対して異なる規則を持つため、これは特定のURLコンポーネントまたはサブコンポーネントをエンコードします。

ですから、引数として適切なNSCharacterSetを指定するだけです。幸いなことに、URLにはURLHostAllowedCharacterSetというとても便利なクラスメソッドがあります。

let encodedHost = unencodedHost.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())

Swift 3の更新 - メソッドは静的プロパティurlHostAllowedになります。

let encodedHost = unencodedHost.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

ただし、注意してください。

このメソッドは、URL文字列全体ではなく、URLコンポーネントまたはサブコンポーネント文字列をパーセントエンコードするためのものです。

127
Antonio Favata

Objective-Cの場合:

NSString *str = ...; // some URL
NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];

nSUTF8StringEncodingのセットはどこにありますか?

パーセントエンコードを可能にする6つのURLコンポーネントおよびサブコンポーネント用に事前定義された文字セットがあります。これらの文字セットは-stringByAddingPercentEncodingWithAllowedCharacters:に渡されます。

 // Predefined character sets for the six URL components and subcomponents which allow percent encoding. These character sets are passed to -stringByAddingPercentEncodingWithAllowedCharacters:.
@interface NSCharacterSet (NSURLUtilities)
+ (NSCharacterSet *)URLUserAllowedCharacterSet;
+ (NSCharacterSet *)URLPasswordAllowedCharacterSet;
+ (NSCharacterSet *)URLHostAllowedCharacterSet;
+ (NSCharacterSet *)URLPathAllowedCharacterSet;
+ (NSCharacterSet *)URLQueryAllowedCharacterSet;
+ (NSCharacterSet *)URLFragmentAllowedCharacterSet;
@end

廃止予定のメッセージには、次のように記載されています(私の強調)。

代わりにstringByAddingPercentEncodingWithAllowedCharacters(_ :)を使用します。常に推奨されるUTF-8エンコード方式を使用します、および各URLコンポーネントまたはサブコンポーネントは有効な文字に対して異なる規則を持つため、これは特定のURLコンポーネントまたはサブコンポーネントをエンコードします。

ですから、引数として適切なNSCharacterSetを指定するだけです。幸いなことに、URLにはURLHostAllowedCharacterSetというとても便利なクラスメソッドがあります。

NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 

ただし、注意してください。

このメソッドは、URL文字列全体ではなく、URLコンポーネントまたはサブコンポーネント文字列をパーセントエンコードするためのものです。

94
ElonChan

URLHostAllowedCharacterSet動作していません FOR MEです。代わりにURLFragmentAllowedCharacterSetを使用します。

OBJECTIVE -C

NSCharacterSet *set = [NSCharacterSet URLFragmentAllowedCharacterSet];
NSString * encodedString = [@"url string" stringByAddingPercentEncodingWithAllowedCharacters:set];

Swift - 4

"url string".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

以下は便利な(反転)文字セットです。

URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
URLHostAllowedCharacterSet      "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet  "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
URLUserAllowedCharacterSet      "#%/:<>?@[\]^`
39
Lal Krishna

Objective-C

このコードは私のために働く:

urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
21
Bilal L

Swift 2.2:

extension String {
 func encodeUTF8() -> String? {
//If I can create an NSURL out of the string nothing is wrong with it
if let _ = NSURL(string: self) {

    return self
}

//Get the last component from the string this will return subSequence
let optionalLastComponent = self.characters.split { $0 == "/" }.last


if let lastComponent = optionalLastComponent {

    //Get the string from the sub sequence by mapping the characters to [String] then reduce the array to String
    let lastComponentAsString = lastComponent.map { String($0) }.reduce("", combine: +)


    //Get the range of the last component
    if let rangeOfLastComponent = self.rangeOfString(lastComponentAsString) {
        //Get the string without its last component
        let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)


        //Encode the last component
        if let lastComponentEncoded = lastComponentAsString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()) {


        //Finally append the original string (without its last component) to the encoded part (encoded last component)
        let encodedString = stringWithoutLastComponent + lastComponentEncoded

            //Return the string (original string/encoded string)
            return encodedString
        }
    }
}

return nil;
}
}
4
Bobj-C

Swift 3.0の場合

urlHostAllowed characterSetを使用できます。

///ホストURLサブコンポーネントで許可されている文字の文字セットを返します。

public static var urlHostAllowed: CharacterSet { get }

WebserviceCalls.getParamValueStringForURLFromDictionary(settingsDict as! Dictionary<String, AnyObject>).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)
2
technerd

「このメソッドは、URL文字列全体ではなく、URLコンポーネントまたはサブコンポーネント文字列をパーセントエンコードすることを目的としています」の意味は何ですか。 ? - GeneCode 2016年9月1日8:30

それはあなたがURLのhttps://xpto.example.com/path/subpathをエンコードすることになっていないことを意味します、?の後に続くものだけ。

次のような場合にそれを実行するためのユースケースがあるためと考えられます。

https://example.com?redirectme=xxxxx

xxxxxは完全にエンコードされたURLです。

1
kindaian

受け入れられた答えに追加する。このメモを考慮に入れる

このメソッドは、URL文字列全体ではなく、URLコンポーネントまたはサブコンポーネント文字列をパーセントエンコードするためのものです。

uRL全体をエンコードしないでください。

let param = "=color:green|\(latitude),\(longitude)&\("zoom=13&size=\(width)x\(height)")&sensor=true&key=\(staticMapKey)".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) 
let url = "https://maps.google.com/maps/api/staticmap?markers" + param!
0
Ayman Ibrahim