[Swift] Alamofire EUC-KR 문제 해결

앱을 개발하다보면 네트워크 통신을 통해 대부분 JSON 포맷으로 데이터를 받고 그것을 Model로 만들어서 사용하게 되는것이 일반적이다. 근데 공부용으로 앱을 개발하다보면 API 서버를 지원하지 않는 케이스가 많이 있는데 그때는 직접 JSON 포맷으로 만들어야한다.

나도 이번에 공부용으로 네이버 뉴스나 긁어서 뿌려주는 앱이나 만들어볼려했었고, Alamofire 를 통해 데이터를 가져와봤다.

Alamofire.responseString 를 통해 가져온 데이터인데.. 네이버 뉴스 소스 코드를 보니 euc-kr로 응답을 보내고 있었다.. 이런 경우에 대처하는 법을 적어두고자 한다.

일단, requestData를 통해 저 내용을 전부 Data 포맷으로 받아와야한다. 나는 아래와 같이 Rx형태로 작성하였다.

func requestData(_ url: String, data: Parameters = [:], method: HTTPMethod = .get) -> Observable<Data> {
        return RxAlamofire.requestData(method, url, parameters: data, encoding: URLEncoding.default, headers: self.headers, interceptor: nil)
            .retry(3)
            .flatMap { Observable.just($1) }
    }

self.headers 가 없을텐데 그냥 빈 배열로 넣어줘도 된다. 저렇게 하면 일단 순수한 Data가 반환된다. 이제 이 데이터를 인코딩하면 된다.

NetworkService.shared
            .requestData("https://news.naver.com/main/list.nhn?mode=LPOD&mid=sec&sid1=001&sid2=140&oid=001&isYeonhapFlash=Y")
            .subscribe(onNext: {
                print("Data", $0)
                print("String", String(data: $0, encoding: String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(0x0422))) ?? "")
            }, onError: {
                print("Error", $0)
            })
            .disposed(by: self.disposeBag)

문자열이 깨지지 않고 잘 보인다!