본문 바로가기
SW 개발/Python

Python에서 URL 한글 깨짐 현상: quote_plus()와 unquote_plus()

by Kibua20 2021. 1. 8.
728x170

Python으로 URL 처리 시 한글이 포함되어 있는 경우 한글 깨짐 현상이 있을 수 있습니다. 이는 URL 처리 시 특수 문자는 포함될 수 없어 ascii로 변환하여 발생하는 현상으로 url.parse 모듈의 quote_plus()와 unquote_plus()를 통해서 해결할 수 있습니다. 

 

※ 만일  quote()와 unqute() 함수로도 한글이 깨져 있다면 인코딩 scheme을 확인해야 합니다.  기본적으로 'utf8'로 인코딩 되어 있는 경우 문제가 없으나, euc-kr이나 cpc-949로 인코딩 된 경우라면 아래 함수 encoding 값을 설정해야 합니다.

 

URL에 한글이 포함되어 있는 경우

Before

https://apkpure.com/t-map-%EB%82%B4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98-%EC%A7%80%EB%8F%84/com.skt.tmap.ku 

 

After

https://apkpure.com/t-map-내비게이션-지도/com.skt.tmap.ku 

 

urllib.parse 함수: quote_plus() vs unquote_plus() 

URL Parser함수 문서는 Python 공식 문서의 urllib.parse 을 참고할 수 있습니다.  urllib.parse 모듈에서 한글 깨짐 현상과 관련해서는 "URL 인용 (quoting)" 부분을 확인해야 합니다. 

 

출처: Python 3.8 공식 문서

URL 인용(quoting) 함수는 특수 문자를 인용하고 비 ASCII 텍스트를 적절히 인코딩하여 프로그램 데이터를 취해서 URL 구성 요소로 안전하게 사용할 수 있도록 하는 데 중점을 둡니다. 또한 해당 작업이 위의 URL 구문 분석 함수로 처리되지 않는 경우 URL 구성 요소의 내용에서 원래 데이터를 다시 만들기 위해 이러한 작업을 뒤집는 것도 지원합니다.

 

quote() 함수는 웹 서버나 브라우저가 인식하기 좋은 ascii 값으로 변환한 값으로 URL에 사용하기에 안전한 값으로 변환한 것이 입니다. 이 경우 사람이 이해하기 힘든 값으로 변환합니다.

 

unquote()는 반대로 역치환 값으로 사람이 읽을 수 있는 값으로 변환합니다. encoding 방식은 기본적으로 utf8로 설정되어 있습니다. 

urllib.parse의 quote() 
urllib.parse의  unquote() 

 

 

 

 

quote_plus()와 unquote_plus() 함수의 사용 예를 아래와 같습니다.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib
from urllib.parse import quote_plus
from urllib.parse import unquote_plus

url_encoded ='https://apkpure.com/t-map-%EB%82%B4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98-%EC%A7%80%EB%8F%84/com.skt.tmap.ku'
url_deocded = unquote_plus(url_encoded)
print (url_deocded)
# Result https://apkpure.com/t-map-내비게이션-지도/com.skt.tmap.ku.apk 

url_deocded = 'https://apkpure.com/t-map-내비게이션-지도/com.skt.tmap.ku' 
url_encoded = quote_plus(url_deocded, safe='://')
print (url_encoded)
#Result = https://apkpure.com/t-map-%EB%82%B4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98-%EC%A7%80%EB%8F%84/com.skt.tmap.ku

 

quote_plus()와 unquote_plus() 함수의 사용 예

 

urlencode() 함수는 Http GET이나 POST 등의 query parameter를 encoding을 합니다.  

 

urllib.parse의  urlencode() 

 

Online URL Encode & Decode

한 가지 팁으로 Python code에서 URL 관련해서 encoding 또는 deocoding 하는 경우에는 그 결과가 정상적인지 확인하기 위해서는 Online ULR encode & decoder를 사용할 수 있습니다. 

 

Online ULR encode & decoder  

 

관련 글

[모바일 SW 개발/Android] - Python BeautifulSoup으로 만든 Apk download 자동화 (Sample code)

[모바일 SW 개발/Android] - 파이썬으로 Apk Download 자동화: Selenium기반의 Apk 크롤러

[모바일 SW 개발/Android] - 안드로이드 스마트 폰 화면 미러링 방법: scrcpy 사용법

[모바일 SW 개발/Python] - Python: 날짜와 시간 처리 함수(현재 날짜, 어제 날짜, UTC 시간)

[모바일 SW 개발/Python] - Python: xmltodict를 활용하여 XML를 JSON으로 변환하는 방법

[모바일 SW 개발/Python] - Python 명령어 처리: Argparse 모듈 (ArgumentParser 사용 예제)

[모바일 SW 개발/Python] - Python에서 사용자 입력 받는 방법: input()

[모바일 SW 개발/Android] - Android에서 Python 실행 (SL4A와 Termux 활용)

[모바일 SW 개발/Android] - Android 에서 리눅스 App 실행: Linux Terminal Emulator (Termux) 활용

[모바일 SW 개발/Android] - Android apkanalyzer 에러: java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema

[모바일 SW 개발/Python] - Python Error: #!/usr/bin/env python3: 그런 파일이나 디렉터리가 없습니다 (No such file or directory)

[개발환경/Web Server] - Python: Web Framework Flask 사용하기

[모바일 SW 개발/Python] - Python: OSError: [Errno 98] Address already in use (Flask)

[모바일 SW 개발/Python] - Python 여러 버전 설치 방법 (3.x and 3.y 동시 설치)

[모바일 SW 개발/Python] - Python code 숨기는 방법: PyInstaller로 실행 파일 만들기

[모바일 SW 개발/Python] - Python 폴더 및 파일 처리 함수 모음

그리드형



댓글0