336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
EUC-KR 인코딩 하기
설명
iOS에서 EUC-KR로 인코딩 하는 문제가 프로젝트를 진행하면서 오랜 시간동안 Warning을 발생시켜서 눈에 가시처럼 보였는데 해결방안을 찾아서 포스팅 하게 되었습니다. 일단 먼저 EUC-KR(EUC-KR은 KS X 1001와 KS X 1003을 사용하는 8비트 문자 인코딩, EUC의 일종이며 대표적인 한글 완성형 인코딩이기 때문에 보통 완성형이라고 불린다. - 위키백과사전) 말그대로 한글 완성형 인코딩이기 때문에 오랜 시간 사용해왔습니다. 네이버,네이트,우체국등 오래된 한국기업 웹페이지는 EUC-KR로 되어있습니다. UTF-8을 사용하면 좋겠지만 용량문제, 전환비용등 때문인지 아직도 사용되고 있습니다. 특히 우체국 API를 통해 주소 검색을 구현할때는 쿼리를 EUC-KR로 인코딩 해서 보내야 올바른 값을 받을 수 있습니다.
기존에 사용 하고 있던 이 방식은 안타깝게도 iOS9버전 부터는 Warning을 발생시킵니다. iOS9에서는 더 이상 사용되지 않기 때문에 권장 UTF-8인코딩을 사용하라는 것입니다.
NSString *queryString = [str stringByAddingPercentEscapesUsingEncoding:-2147481280];
//first deprecated in iOS 9.0 - Use -stringByAddingPercentEncodingWithAllowedCharacters: instead, which always uses the recommended UTF-8 encoding, and which encodes for a specific URL component or subcomponent since each URL component or subcomponent has different rules for what characters are valid.
포기하고 있다가 다른분을 도와주다가 우연찮게 찾아서 이렇게 포스팅을 하게되었습니다.
사용환경
* Swift3.x * Xcode 8.3.3
소스 코드
- Objective-C
- (NSString *)euckrEncodingObjectiveC:(NSString *)str {
NSMutableString *outputQuery = [NSMutableString string];
NSUInteger encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingEUC_KR);
const char * source = [str cStringUsingEncoding:encoding];
NSInteger sourceLen = strlen((const char *)source);
for (int i = 0; i < sourceLen; ++i)
{
const unsigned char thisChar = source[i];
if (thisChar == ' ') {
[outputQuery appendString:@"+"];
} else if (thisChar == '.' || thisChar == '-' || thisChar == '_' ||
(thisChar >= 'a' && thisChar <= 'z') ||
(thisChar >= 'A' && thisChar <= 'Z') ||
(thisChar >= '0' && thisChar <= '9'))
{
[outputQuery appendFormat:@"%c", thisChar];
} else {
[outputQuery appendFormat:@"%%%02X", thisChar];
}
}
return outputQuery;
}
- Swift
func euckrEncoding(_ query: String) -> String { //EUC-KR 인코딩
let rawEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.EUC_KR.rawValue))
let encoding = String.Encoding(rawValue: rawEncoding)
let eucKRStringData = query.data(using: encoding) ?? Data()
let outputQuery = eucKRStringData.map {byte->String in
if byte >= UInt8(ascii: "A") && byte <= UInt8(ascii: "Z")
|| byte >= UInt8(ascii: "a") && byte <= UInt8(ascii: "z")
|| byte >= UInt8(ascii: "0") && byte <= UInt8(ascii: "9")
|| byte == UInt8(ascii: "_") || byte == UInt8(ascii: ".") || byte == UInt8(ascii: "-")
{
return String(Character(UnicodeScalar(UInt32(byte))!))
} else if byte == UInt8(ascii: " ") {
return "+"
} else {
return String(format: "%%%02X", byte)
}
}.joined()
return outputQuery
}
마치며
EUC-KR보다 UTF-8을 권장하지만 아직 한국내에서는 불가능한거 같습니다. 위에도 언급해듯이 전환비용, 용량문제등 아직 해결할 문제들이 많은거 같습니다. 오랫동안 눈에 밟히던 Warning을 없앤것만으로도 기분 좋은 일인거 같습니다. 틀린점이나 궁금한점이 있다면 댓글 남겨주시면 감사합니다 :)
참고 사이트
'iOS 프로그래밍 > iOS' 카테고리의 다른 글
| iOS)위도,경도로 주소 가져오기 (1) | 2017.12.19 |
|---|---|
| iOS) iOS 런처이미지 사이즈표 (0) | 2017.10.26 |
| iOS) 카카오 API를 통해 웹 이미지 검색하기 (2) | 2017.09.13 |
| iOS) UIAlertController-ActionSheet (0) | 2017.07.26 |
| iOS) UIAlertController - alert (0) | 2017.07.11 |