Last active
July 26, 2018 11:58
-
-
Save neoneo40/47bf3b460b345ea79630 to your computer and use it in GitHub Desktop.
I don't know encoding in python3. Reference: http://www.slideshare.net/daesung7kang/character-encoding-in-python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
from urllib.parse import quote, unquote | |
str1 = '인코딩 제발ㅠㅠ' | |
str1.encode('euc-kr') | |
# b'\xc0\xce\xc4\xda\xb5\xf9 \xc1\xa6\xb9\xdf\xa4\xd0\xa4\xd0' | |
str_euckr = quote(str1.encode('euc-kr')) | |
str_euckr | |
# '%C0%CE%C4%DA%B5%F9%20%C1%A6%B9%DF%A4%D0%A4%D0' | |
# 여기에서 6번째 줄처럼 나와야 되는데.. 이렇게 나옴. | |
unquote(str_euckr) | |
# '���ڵ� ���ߤФ�' | |
unquote(str_euckr).decode('euc-kr') | |
# --------------------------------------------------------------------------- | |
# AttributeError Traceback (most recent call last) | |
# <ipython-input-35-0f3add5492cc> in <module>() | |
# ----> 1 unquote(str_euckr).decode('euc-kr') | |
# AttributeError: 'str' object has no attribute 'decode' | |
# 성공! | |
unquote(str_euckr, encoding='euc-kr') | |
# '인코딩 제발ㅠㅠ' |
삽질
- POST 방식으로 데이터를 보낼 때 'euc-kr'로 인코딩해서 보내야 하는데
requests.post(url, data=data)
# '인코딩 제발ㅠㅠ' 을 post로 보냈을 때의 문제점
# '%25C0%25CE%25C4%25DA%25B5%25F9+%25C1%25A6%25B9%25DF%25A4%25D0%25A4%25D0'
- 이렇게 보낼때 % -> %25로 바뀐다.
- 왜 이렇게 되는지 살펴봤더니 내가 이미 euc-kr로 인코딩했는데 post에서 또 한 번 utf-8로 인코딩을 진행한다. 그렇기 때문에 일일이 대응을 하는 방법은 너무 노가다성이 많다.
- 이걸 발견할 수 있었던 원인: 등록은 제대로 됐는데 이름이 모두 깨져서 알게됐다.
- 해결하기 위해서는 가장 마지막에만 euc-kr로 인코딩해주면 된다.
- 그렇다면 일일이 필드를 모두 encoding 하기 위해서 귀찮게 하지 않아도 된다.
- 모두 utf-8로 작성하고 가장 마지막에서 euc-kr로 인코딩해서 보내면 Game Over!!
requests.post(url, data=urlencode(data, encoding='euc-kr'))
# '인코딩 제발ㅠㅠ' 제대로 euc-kr로 인코딩 된 모습
# '%C0%CE%C4%DA%B5%F9+%C1%A6%B9%DF%A4%D0%A4%D0'
- 예~~ 성공입니다요.
- 이것 때문에 또 1시간 삽질했음.
- 나중을 위해서 기억해두기
- 저렇게 마지막에 encoding 해주면 되므로 그 이전에 일일이 euc-kr로 인코딩해주던 것을 삭제해주자..(사실 노가다성이 많아서 나도 가장 마지막에 인코딩해줄 수 있는것이 없을까? 생각하다가 귀찮아서 그냥 넘어갔는데 어차피 건너가야 할 바다였다..)
- 제대로 인코딩 되는지 확인하기 위해서는 packet level에서 확인할 수 있는 wireshark를 사용하면 된다. 그럼 어떤 데이터들이 날라가는지 보인다. 이래서 low level 기술이 중요하다는걸 새삼 느낀다. 만약 내가 http level에서 놀았다면 packet level로 내려갈 수 없어서 해결하려면 엄청난 삽질을 했을텐데 😄
- Developer Interface — Requests 2.8.1 documentation: 여기를 잘 살펴보자. 개발자가 보기 쉽게 API들의 상세 스펙이 잘 나타나 있으니.. 어떤 메소드가 있고 어떤 기능들을 하는지 읽어보자.
테스트
- 여기에서 좀 더 나아가자면 테스트 코드가 있었다면 이런 삽질을 통하지 않아도 바로 발견할 수 있었잖아??
- 굳이 wireshark까지 쓰지 않아도 바로 발견할 수 있었을텐데 말이지.
- 이게 테스트의 부재 때문에 생겼구나..
- RFTM - Sui generis. : 네이버 블로그: Read The Fuckint Manual!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
다음과 같이 해보시면 됩니다.
깨달은 점