꾸준히 안타치기

URL encoding , 한글인코딩 본문

iOS/문제해결

URL encoding , 한글인코딩

글자줍기 2022. 6. 7. 20:10
반응형

검색기능을 만들었는데 영어, 숫자만 검색되고 한글은 검색결과가 나오지 않았다.

문제) URL세션으로 API 검색기능을 구현함 -> 한글검색은 안되는 상태. url에 한글이 포함되어 있을 경우에 서버는 한글을 읽을수 없다. 띄어쓰기도 인식X

 

해결) addingPercentEconding과 urlQueryAllowed 사용해서 URL String을 ->  String으로 변경해 전송

인코딩후 서버로 전송한다.

    // word에 담긴 단어를 가져옴
        print("firstTabVC/ 단어입력내용 :\(self.word)")
        // 한글이 있는 URL
        let someURLString = self.BASEURL+"post/0iOS_feedSearch.php?word=\(word)"
        // 한글이 있는 URL String을 addingPercentEncoding으로 string으로 변경한다.(urlQueryAllowed를 사용)
        let result = someURLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
       
       // URL인코딩
        var components = URLComponents(string: result!)
       // 결과(http://0.00.00.000/post/0iOS_feedSearch.php?word=%25ED%2595%2598)
        print(components)

전체코드

더보기
 // 검색요청 API
    func searchWord(success: (()->Void)? = nil, fail: ((String)->Void)? = nil) {
        // 검색창에 작성한 단어
        print("firstTabVC/ 단어입력내용 :\(self.word)")
        // word에 담긴 단어를 가져옴
        
        // URL세선 시작
        let sessionConfig = URLSessionConfiguration.default
        let session = URLSession(configuration: sessionConfig)
        // 한글이 있는 URL
        let someURLString = self.BASEURL+"post/0iOS_feedSearch.php?word=\(word)"
        // 한글이 있는 URL String을 addingPercentEncoding으로 string으로 변경한다.(urlQueryAllowed를 사용)
        let result = someURLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        // 컴포넌트에 남아서 보내기
        var components = URLComponents(string: result!)
        
        print(components)
        // 결과(http://0.00.00.00/post/0iOS_feedSearch.php?word=%25ED%2595%2598)
     
        let word = URLQueryItem(name: "word", value: word)
        components?.queryItems = [word]
        
        // url이 없으면 리턴한다. 여기서 끝
        guard let url = components?.url else { return }
        
        // 값이 있다면 받아와서 넣음.
        var request = URLRequest(url: url)
        
        request.httpMethod = "GET"
        
        let task = session.dataTask(with: request) { data, response, error in
            print( (response as! HTTPURLResponse).statusCode )
            
            // 데이터가 있을때만 파싱한다.
            if let hasData = data {
                // 모델만든것 가져다가 디코더해준다.
                do{
                    // 만들어놓은 피드모델에 담음, 데이터를 디코딩해서, 디코딩은 try catch문 써줘야함
                    // 여기서 실행을 하고 오류가 나면 catch로 던져서 프린트해주겠다.
                    self.feedModel = try JSONDecoder().decode(FeedModel.self, from: hasData)
                                        print(self.feedModel ?? "no data")
                    
                    // 모든UI 작업은 메인쓰레드에서 이루어져야한다.
                    DispatchQueue.main.async {
                        // 테이블뷰 갱신
                        self.tableView.reloadData()
                    }
                    
                } catch {
                    print("error: ", error)
                }
            }else{
                // sucess가 0이면
                self.isCalling = false
                self.alert("좋아요업로드 응답실패")
            }
        }
        // task를 실행한다.
        task.resume()
        // 세션끝내기
        session.finishTasksAndInvalidate()
        
    }//함수 끝

 

참고한예제 ) addingPercentEconding과 urlQueryAllowed 사용하여 시도 (?를 포함해야 되므로) 

  • 한글이 있는 url string을 percent encdoing으로 string 변경
    let someURLString = "https://ios-development.tistory.com/search?keyword=검색단어"
    let result = someURLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
    print(result) // Optional("https://ios-development.tistory.com/search?keyword=%EC%B5%9C%EC%8B%A0%EA%B8%B0%EC%88%A0")​
  • URL 인코딩
    let url = URL(string: result!)
    print(url) // https://ios-development.tistory.com/search?keyword=%EC%B5%9C%EC%8B%A0%EA%B8%B0%EC%88%A0​

CharacterSet

각 Set 별로 알파벳, 숫자 외에 포함할 수 있는 특수문자의 목록. 여기에 포함되지 않는 문자는 encoding이 되어서 변환된다.

  • urlQueryAllowed
! $ & \ ( ) * +  - . / : ; = ? @ _ ~
  • urlPathAllowed
! $ & \ ( ) * +  - . / : = @ _ ~

인코딩  Set종류 / CharacterSet에 정의된 문자들은 encoding되는게 아닌 키워드로 인식하라는 의미

 

참고  https://ios-development.tistory.com/880

https://developer.apple.com/documentation/foundation/characterset#2902136

반응형
Comments