Swift 인코딩 옵션
01 Sep 2018 | swift encode translation한글인코딩 처리
인코딩 처리 옵션이 엄청나게 많은데 일단 한글은 다음처럼 .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