Swift 인코딩 옵션

|

한글인코딩 처리

인코딩 처리 옵션이 엄청나게 많은데 일단 한글은 다음처럼 .urlQueryAllowed를 사용하자.

출처: https://m.blog.naver.com/itperson/220860433667

func makeStringKoreanEncoded(_ string: String) -> String {
    return string.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? string
}

Query Allowed 옵션에 대한 표는 다음과 같다.

key chars example
urlFragmentAllowed !$&’()*+,-./:;=?@_~ http://google.com?a=b&c=d
urlHostAllowed !$&’()*+,-.:;=[]_~ http:%2F%2Fgoogle.com%3Fa=b&c=d
urlPathAllowed !$&’()*+,-./:=@_~ http://google.com%3Fa=b&c=d
urlQueryAllowed !$&’()*+,-./:;=?@_~ http://google.com?a=b&c=d
urlUserAllowed !$&’()*+,-.;=_~ http%3A%2F%2Fgoogle.com%3Fa=b&c=d
urlPathAllowed !$&’()*+,-./:=@_~ http://google.com%3Fa=b&c=d

출처:

http://slee2540.tistory.com/?page=2

RFC3986을 따르는 경우

아래

RFC 3986의 섹션 2.3에 의하면 아래 문자들은 인코딩 하면 안 됨. 보다시피 틸드(tilde)를 인코딩해서는 안된다.

ALPHA
DIGIT
“-”
“.”
“_”
“~”

더불어 query 는 /와 ? 문자또한 인코딩해서는 안된다. 이는 Alamofire 등에 구현된 내용이기도 함.

주의: 아래 코드는 SWIFT2 이므로 변환필요

extension String {
  func stringByAddingPercentEncodingForRFC3986() -> String? {
    let unreserved = "-._~/?"
    let allowed = NSMutableCharacterSet.alphanumericCharacterSet()
    allowed.addCharactersInString(unreserved)
    return stringByAddingPercentEncodingWithAllowedCharacters(allowed)
  }
}

// 사용
let query = "one&two =three"
let encoded = query.stringByAddingPercentEncodingForRFC3986()
// "one%26two%20%3Dthree"

x-www-form-urlencoded 를 따르는 경우

W3C HTML5 가 권장하는 인코딩 폼 데이터는 RFC 3986와 살짝 다르다. Section 4.10.22.5에 따르면 다음 문자에 대해 인코딩을 하면 안 된다. RFC 3986의 경우 별표( *)를 인코딩하지만 여기서는 그 반이며 틸트(~)의 경우에 RFC 3986는 인코딩제외목록에 있지만 여기서는 그 반대다. 사실 아주 혼동스러움 그 자체이다!!!

ALPHA DIGIT “*” “-” “.” “_”

코드는 위의 것 보다 조금 더 복잡하다.

public func stringByAddingPercentEncodingForFormData(plusForSpace: Bool=false) -> String? {
    let unreserved = "*-._"
     var allowed = CharacterSet.alphanumerics
    allowed.insert(charactersIn: unreserved)
    if plusForSpace {
        allowed.insert(charactersIn: " ")
    }

    var encoded = self.addingPercentEncoding(withAllowedCharacters: allowed)
    if plusForSpace {
         encoded =  encoded?.replacingOccurrences(of: " ", with: "+")
    }
    return encoded
}

// 사용
let query = "one two"
let space = query.stringByAddingPercentEncodingForFormData()
// "one%20two"
// 기본 옵션으로 하면 공백 --> %20으로 인코딩 한다.

let plus = query.stringByAddingPercentEncodingForFormData(true)
// "one+two"

출처: https://useyourloaf.com/blog/how-to-percent-encode-a-url-string/

Query와 URL방식으로 인코딩 할 때

참고: https://code.i-harness.com/ko-kr/q/176a188

let originalString = "http://www.ihtc.cc?name=htc&title=iOS开发工程师"

1. encodingQuery :

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

결과:

"http://www.ihtc.cc?name=htc&title=iOS%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88" 

2. encodingURL :

let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

결과:

"http:%2F%2Fwww.ihtc.cc%3Fname=htc&title=iOS%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88"

이미지URL경로에 한글이 포함될 때

여기부터 내용은 모두 발췌한 것이다.

Kingfisher는 이미지 캐싱 라이브러리이다.

example.swift

let url = URL(string: "url_of_your_image")
imageView.kf.setImage(with: url)

이슈: Kingfisher에서 요청 할 때 url에 한국어가 포함되어 있을 때

url에 한국어가 포함된 경우 addingPercentEncoding을 이용하면 된다.

example.swift

// 원하는 urlString을 addingPercentEncoding을 통해 바꿔줍니다.
let urlString = urlString?.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)

// 그 후 원하는 ImageView에 적용시키시면 됩니다.
imageView.kf.setImage(with: URL(string: urlString), placeholder: defaultImg, options: [.transition(ImageTransition.fade(0.5))])

출처: (https://twpower.github.io/tags#Swift)

기타사항(toRead)

URLComponets에 대한 글

https://cocoacasts.com/working-with-nsurlcomponents-in-swift

==> 아직 읽어보지 못함.

UNICODE에 대한 링크

https://en.wikipedia.org/wiki/Percent-encoding

캐릭터셋 참고: https://www.degraeve.com/reference/urlencoding.php

URL 인코딩된 캐릭터

      backspace      %08
      tab            %09
      linefeed       %0A
      creturn        %0D
      space          %20
      !              %21
      "              %22
      #              %23
      $              %24
      %              %25
      &              %26
      '              %27
      (              %28
      )              %29
      *              %2A
      +              %2B
      ,              %2C
      -              %2D
      .              %2E
      /              %2F
      0              %30
      1              %31
      2              %32
      3              %33
      4              %34
      5              %35
      6              %36
      7              %37
      8              %38
      9              %39
      :              %3A
      ;              %3B
      <              %3C
      =              %3D
      >              %3E
      ?              %3F
      @              %40
      A              %41
      B              %42
      C              %43
      D              %44
      E              %45
      F              %46
      G              %47
      H              %48
      I              %49
      J              %4A
      K              %4B
      L              %4C
      M              %4D
      N              %4E
      O              %4F
      P              %50
      Q              %51
      R              %52
      S              %53
      T              %54
      U              %55
      V              %56
      W              %57
      X              %58
      Y              %59
      Z              %5A
      [              %5B
      \              %5C
      ]              %5D
      ^              %5E
      _              %5F
      `              %60
      a              %61
      b              %62
      c              %63
      d              %64
      e              %65
      f              %66
      g              %67
      h              %68
      i              %69
      j              %6A
      k              %6B
      l              %6C
      m              %6D
      n              %6E
      o              %6F
      p              %70
      q              %71
      r              %72
      s              %73
      t              %74
      u              %75
      v              %76
      w              %77
      x              %78
      y              %79
      z              %7A
      {              %7B
      |              %7C
      }              %7D
      ~              %7E
      ¢              %A2
      £              %A3
      ¥              %A5
      |              %A6
      §              %A7
      «              %AB
      ¬              %AC
      ¯              %AD
      º              %B0
      ±              %B1
      ª              %B2
      ,              %B4
      µ              %B5
      »              %BB
      ¼              %BC
      ½              %BD
      ¿              %BF
      À              %C0
      Á              %C1
      Â              %C2
      Ã              %C3
      Ä              %C4
      Å              %C5
      Æ              %C6
      Ç              %C7
      È              %C8
      É              %C9
      Ê              %CA
      Ë              %CB
      Ì              %CC
      Í              %CD
      Î              %CE
      Ï              %CF
      Ð              %D0
      Ñ              %D1
      Ò              %D2
      Ó              %D3
      Ô              %D4
      Õ              %D5
      Ö              %D6
      Ø              %D8
      Ù              %D9
      Ú              %DA
      Û              %DB
      Ü              %DC
      Ý              %DD
      Þ              %DE
      ß              %DF
      à              %E0
      á              %E1
      â              %E2
      ã              %E3
      ä              %E4
      å              %E5
      æ              %E6
      ç              %E7
      è              %E8
      é              %E9
      ê              %EA
      ë              %EB
      ì              %EC
      í              %ED
      î              %EE
      ï              %EF
      ð              %F0
      ñ              %F1
      ò              %F2
      ó              %F3
      ô              %F4
      õ              %F5
      ö              %F6
      ÷              %F7
      ø              %F8
      ù              %F9
      ú              %FA
      û              %FB
      ü              %FC
      ý              %FD
      þ              %FE
      ÿ              %FF

Comments