Python 3.12 unquote 뒤 �가 보일 때: replace·strict와 원본 바이트 비교

Python 3.12의 unquote는 기본적으로 UTF-8을 사용하고, 잘못된 바이트열을 만났을 때 errors="replace"로 대체 문자를 넣습니다. 보기 좋은 한글로 바꾸려다가 �가 생겼다면, 변환 결과로 원본 주소를 덮어쓰지 않는 것이 먼저입니다.
1. 짧은 입력으로 차이를 확인하기
네트워크 요청 없이 아래 문자열만으로 비교할 수 있습니다. %FF는 이 연습에서 의도적으로 넣은 UTF-8 오류 입력입니다. 실제 공개 글이나 고객 주소를 예제로 복사할 필요는 없습니다.
from urllib.parse import unquote, unquote_to_bytes
raw = "%FF"
print(repr(unquote(raw))) # '�'
print(unquote_to_bytes(raw)) # b'\xff'
try:
unquote(raw, errors="strict")
except UnicodeDecodeError:
print("review needed")Python 3.12 unquote 오류 처리 원문 보기
2. 문자열 대체와 원본 바이트는 다른 결과입니다

| 방법 | 예제의 결과 | 목록에 남길 점 |
|---|---|---|
| unquote(raw) | 대체 문자 �가 포함된 문자열 | 오류가 없었다고 판단하지 않기 |
| errors="strict" | UnicodeDecodeError 발생 | 별도 검토 대상으로 남기기 |
| unquote_to_bytes(raw) | 바이트 b'\xff' | 어떤 문자 인코딩인지 아직 결정하지 않음 |
공식 문서는 unquote_to_bytes가 %xx를 바이트로 되돌리는 기능이라고 설명합니다. 바이트를 얻었다고 원래 작성자가 의도한 글자를 복원한 것은 아닙니다. 원문이 어떤 인코딩인지 확인할 근거가 없으면 다른 인코딩을 무작위로 바꾸며 “맞는 글자”를 고르지 마세요.
3. 링크 목록에는 원본·표시·검토를 나누세요
예를 들어 개인 블로그 링크를 정리한다면 raw_href, decoded_display, review_note 세 칸으로 남길 수 있습니다. 독자에게 보여 줄 이름과 실제 클릭 주소를 같은 칸에 덮어쓰지 않는 방식입니다.
| 자체 정리 양식 | 기록 예 |
|---|---|
| 원본 | 변환 전 % 인코딩 문자열 |
| 표시용 결과 | 변환에 사용한 함수와 인코딩 |
| 검토 필요 | strict 실패 여부와 확인할 출처 |
이 예제는 잘못된 디코딩을 목록에서 발견하는 방법입니다. URL의 접속 안전성, 소유자, 공개 상태를 판정하는 보안 검사는 아닙니다. 결과를 클릭하거나 배포하기 전에는 실제 목적지와 사용 목적에 맞는 점검이 별도로 필요합니다.
4. 자주 묻는 질문
replace를 쓰면 원래 글자가 돌아오나요? 아닙니다. 처리할 수 없는 입력을 대체 문자로 나타내는 동작입니다.
strict에서 오류가 나면 링크를 삭제하면 되나요? 자동 삭제 기준으로 삼기보다 원본과 오류를 보존해 확인하세요. 이 예제는 링크를 방문하거나 파일을 삭제하지 않습니다.
공식 자료 확인 2026.10.17: Python 3.12 urllib.parse 공식 문서.
대표 썸네일은 AI로 제작한 개념 이미지이며 본문 도표는 직접 구성했습니다.