programing

Swift에서 URL 인코딩 방법

javamemo 2023. 4. 10. 20:50
반응형

Swift에서 URL 인코딩 방법

은 나의 ★★★★★★★★★★★★★★★★★★★★입니다.URL

는 '이러다''라는 address 않습니다.urlpath.

왜 그런지 아는 사람 있어요?

var address:string
address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
let urlpath = NSString(format: "http://maps.googleapis.com/maps/api/geocode/json?address="+"\(address)")

스위프트 4.2

var urlString = originalString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

Swift 3.0

var address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
let escapedAddress = address.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
let urlpath = String(format: "http://maps.googleapis.com/maps/api/geocode/json?address=\(escapedAddress)")

사용방법:

var escapedAddress = address.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())

사용 iOS 9 및 OS X v10.11에서는 권장되지 않음

var address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
var escapedAddress = address.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
let urlpath = NSString(format: "http://maps.googleapis.com/maps/api/geocode/json?address=\(escapedAddress)")

URL 에 추가하는 값에 예약된 문자를 포함할 수 있는 경우(RFC 3986 섹션2에서 정의) 퍼센트 이스케이프를 구체화할 필요가 있습니다.특히,& ★★★★★★★★★★★★★★★★★」+내의 쿼리 값 하지 않습니다(URL이 유효하기 때문입니다).URL 쿼리 파라미터 값 내에서는 유효하지 않습니다(이유는&값을 와 ""의 됩니다.+을 참조)안타깝게도 표준 백분율 이스케이프에서는 이러한 구분 기호가 이스케이프되지 않습니다.

따라서 RFC 3986의 예약되지 않은 문자 목록에 포함되지 않은 모든 문자를 백분율로 이스케이프할 수 있습니다.

URI에서 허용되지만 예약된 용도가 없는 문자는 예약되지 않은 문자라고 합니다.여기에는 대소문자, 십진수, 하이픈, 마침표, 언더스코어 및 칠드가 포함됩니다.

예약되지 않은 = ALPHA / DIGIT / "-" / "." / "_" / "~"

섹션는 RFC 3.4의 추가를 더욱 .? ★★★★★★★★★★★★★★★★★」/쿼리 내에서 허용되는 문자 목록으로 이동합니다.

슬래시("/") 및 물음표("?")는 쿼리 구성 요소 내의 데이터를 나타낼 수 있습니다.계층 구분자를 찾을 때 쿼리 데이터와 경로 데이터를 구분하지 못하기 때문에 오래된 잘못된 구현 중에는 이러한 데이터를 상대 참조의 기본 URI로 사용할 때(섹션 5.1) 데이터가 올바르게 처리되지 않을 수 있습니다.단, 쿼리 컴포넌트는 "key=value" 쌍의 형태로 식별 정보를 전송하는 데 자주 사용되며 자주 사용되는 값은 다른 URI에 대한 참조이므로 이러한 문자를 백분율로 인코딩하지 않는 것이 사용 편의성에 더 좋을 수 있습니다.

요즘엔 이런 거 많이 쓰시잖아요.URLComponents" " " 리스 、 " : " 。

var address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
var components = URLComponents(string: "http://maps.googleapis.com/maps/api/geocode/json")!
components.queryItems = [URLQueryItem(name: "address", value: address)]
let url = components.url!

덧붙여서, W3C HTML 사양의 섹션 5.2, URL 인코딩 폼 데이터에서는, 상기의 RFC에서는 고려되고 있지 않지만, 다음과 같이 말하고 있습니다.application/x-www-form-urlencoded은 공백 도 공백 문자로 .+문자(스케이프하면 안 되는 문자에 아스타리스크 포함)를 지정합니다. 아쉽게도 ★★★★★★★★★★★★★★★★★★★★★★★★★.URLComponents 경우 퍼센트가 은 "스케이프율"을하기 전에 를 이스케이프할 을 권장합니다.url의 of의 URLComponents★★★★★★★★★★★★★★★★★★:

// configure `components` as shown above, and then:

components.percentEncodedQuery = components.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")
let url = components.url!

Swift 2의 경우, 이 비율을 모두 수동으로 이스케이프하는 경우, 이 답변의 이전 버전을 참조하십시오.

스위프트 3:

let escapedString = originalString.addingPercentEncoding(withAllowedCharacters:NSCharacterSet.urlQueryAllowed)

Swift 2.0

let needsLove = "string needin some URL love"
let safeURL = needsLove.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!

유용한 프로게이밍 힌트

URLQueryAllowedCharacterSet할 수 이 문자 에는 URL이 포함되어 있기 때문입니다.&,?,/URL " " " " " " " "

/?paramname=paramvalue&paramname=paramvalue

이러한 문자는 전체적으로 URL 쿼리에서는 허용되지만 파라미터 값에서는 허용되지 않습니다.

RFC 3986에서는 예약되지 않은 문자에 대해 구체적으로 설명하고 있습니다.이 문자는 허용된 문자와는 다릅니다.

2.3. 예약되지 않은 문자

URI(URI)
이치노여기에는 대소문자, 십진수, 하이픈, 마침표, 언더스코어 및 칠드가 포함됩니다.

  unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

따라서:

extension String {
    var URLEncoded:String {

        let unreservedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"
        let unreservedCharsSet: CharacterSet = CharacterSet(charactersIn: unreservedChars)
        let encodedString = self.addingPercentEncoding(withAllowedCharacters: unreservedCharsSet)!
        return encodedString
    }
}

는 콜을 alphanumericCharacterSet반환되는 문자 집합의 크기가 크기 때문에(806자). Unicode 수 (Unicode 문자 수)를.alphanumericCharacterSetURL 인코딩의 목적으로 사용하는 것은 단순히 잘못된 것입니다.

사용방법:

let URLEncodedString = myString.URLEncoded

스위프트 4.1

원하는 옵션(urlQueryAllowed)에 따라 "문자 집합"을 만듭니다.그런 다음 불필요한 문자(+&)를 삭제합니다.그런 다음 해당 문자 집합을 "adding Percent Encoding"으로 전달합니다.

var address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
var queryCharSet = NSCharacterSet.urlQueryAllowed
queryCharSet.remove(charactersIn: "+&")
let escapedAddress = address.addingPercentEncoding(withAllowedCharacters: queryCharSet)!
let urlpath = String(format: "http://maps.googleapis.com/maps/api/geocode/json?address=\(escapedAddress)")

XCODE 8, SWIFT 3.0

grokswift에서

문자열에서 URL을 작성하는 것은 버그의 지뢰밭입니다.쿼리에서 URL 인코딩을 하나만 놓치면 API 호출이 실패하고 표시할 데이터가 앱에 없습니다(또는 예상하지 못한 경우 크래시됩니다).iOS 8 이후 및 을 사용하여 URL을 구축하는 더 나은 방법이 있습니다.

func createURLWithComponents() -> URL? {
    var urlComponents = URLComponents()
    urlComponents.scheme = "http"
    urlComponents.host = "maps.googleapis.com"
    urlComponents.path = "/maps/api/geocode/json"

    let addressQuery = URLQueryItem(name: "address", value: "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India")
    urlComponents.queryItems = [addressQuery]

    return urlComponents.url
}

다음은 다음을 사용하여 url에 액세스하는 코드입니다.guard진술.

guard let url = createURLWithComponents() else {
            print("invalid URL")
            return nil
      }
      print(url)

출력:

http://maps.googleapis.com/maps/api/geocode/json?address=American%20Tourister,%20Abids%20Road,%20Bogulkunta,%20Hyderabad,%20Andhra%20Pradesh,%20India

상세 읽기: NSURLC 컴포넌트NSURLQueryItems를 사용한 URL 구축

RFC 3986 비예약 문자의 유효한 인코딩 함수에 대한 String 클래스를 확장하기 위한 Desmond Hume의 답변만 완료하면 됩니다(쿼리 FORM 파라미터를 인코딩하는 경우 필요).

스위프트 3

extension String {

    var RFC3986UnreservedEncoded:String {
        let unreservedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"
        let unreservedCharsSet: CharacterSet = CharacterSet(charactersIn: unreservedChars)
        let encodedString: String = self.addingPercentEncoding(withAllowedCharacters: unreservedCharsSet)!
        return encodedString
    }
}

Swift 3용으로 업데이트됨:

var escapedAddress = address.addingPercentEncoding(
    withAllowedCharacters: CharacterSet.urlQueryAllowed)

Mac OS 10.9 Maverics 및 iOS 7의 경우NSURLComponents다양한 URL 부분의 인코딩을 매우 편리하게 처리할 수 있는 기능이 도입되었습니다.

NSURLComponents 클래스는 RFC 3986에 따라 URL을 해석하고 구성 요소에서 URL을 구축하도록 설계된 클래스입니다.동작은 오래된 RFC에 준거한NSURL 클래스와는 미묘하게 다릅니다.그러나 URL 구성 요소 개체의 내용을 기반으로 NSURL 개체를 쉽게 가져올 수 있습니다.

let address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"

let components = NSURLComponents(string: "http://maps.googleapis.com/maps/api/geocode/json")!
// create a query item key=value
let queryItem = NSURLQueryItem(name: "address", value: address)
// add the query item to the URL, NSURLComponents takes care of adding the question mark.
components.queryItems = [queryItem]
// get the properly percent encoded string
let urlpath = components.string!
print(urlpath)

위의 답변에 Bryan Chen을 추가합니다.

혹시라도 Alarmofire와 비슷한 것을 얻을 수 있을까 봐.

오류: Alarmofire가 최적화로 컴파일되었습니다. 스테핑이 이상하게 동작할 수 있으며 변수를 사용할 수 없습니다.

그다지 설명적인 오류는 아닙니다.구글 지오 서비스의 URL을 작성할 때 오류가 발생했습니다.주소 자체를 인코딩하지 않고 URL 끝에 주소를 추가했습니다.브라이언 첸의 솔루션을 사용하여 해결할 수 있었습니다.

var streetAdress = "123 fake street, new york, ny"
var escapedStreetAddress = streetAddress.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
let url = "\(self.baseUrl)&address=\(escapedAddress!)"

그걸로 해결됐어!주소에 공백이나 쉼표 등이 있는 것은 마음에 들지 않았습니다.

이게 다른 사람에게 도움이 되길 바라!

파라미터를 ISO-8859-1로 부호화할 필요가 있기 때문에 addingPercentEncoding() 메서드는 사용할 수 없습니다.스위프트 4에서 직접 해결 방법을 생각해 봤습니다.

extension String {

  // Url percent encoding according to RFC3986 specifications
  // https://tools.ietf.org/html/rfc3986#section-2.1
  func urlPercentEncoded(withAllowedCharacters allowedCharacters: 
    CharacterSet, encoding: String.Encoding) -> String {
    var returnStr = ""

    // Compute each char seperatly
    for char in self {
      let charStr = String(char)
      let charScalar = charStr.unicodeScalars[charStr.unicodeScalars.startIndex]
      if allowedCharacters.contains(charScalar) == false,
        let bytesOfChar = charStr.data(using: encoding) {
        // Get the hexStr of every notAllowed-char-byte and put a % infront of it, append the result to the returnString
        for byte in bytesOfChar {
          returnStr += "%" + String(format: "%02hhX", byte as CVarArg)
        }
      } else {
        returnStr += charStr
      }
    }

    return returnStr
  }

}

사용방법:

"aouäöü!".urlPercentEncoded(withAllowedCharacters: .urlQueryAllowed,
                                         encoding: .isoLatin1) 
// Results in -> "aou%E4%F6%FC!"

마지막 컴포넌트가 라틴 문자가 아닌 경우 에서 다음 작업을 수행했습니다.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;
}
}

언급URL : https://stackoverflow.com/questions/24879659/how-to-encode-a-url-in-swift

반응형