Skip to content

Instantly share code, notes, and snippets.

@neoneo40
Last active July 26, 2018 11:58
Show Gist options
  • Save neoneo40/47bf3b460b345ea79630 to your computer and use it in GitHub Desktop.
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
#!/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')
# '인코딩 제발ㅠㅠ'
@neoneo40
Copy link
Author

다음과 같이 해보시면 됩니다.

unquote(str_euckr, encoding='euc-kr')
  • 파이썬코리아 강대성님 답변
    • 제 발표내용을 언급해주셔서 감사합니다. 하지만 많은 도움은 못 되었네요. 조금이다로 도움이 되고자 댓글을 답니다.
    • quote의 문서를 보면....
    • urllib.parse.quote(string, safe='/', encoding=None, errors=None), quote 여기의 string에는 str, bytes 모두 가능하다고 합니다. 원본 str형식을 넘기고 인코딩을 명시하면 간단하게 구현하실 수 있습니다. quote('인코딩 제발', encoding='EUC_KR) 그리고 unquote()가 bytes형이 아닌 str형을 반환하기에 unquote().decode() 와 같이 쓰는 것보다 unquote_to_bytes('%C0%CE%C4%DA%B5%F9%20%C1%A6%B9%DF' ).decode('EUC-KR') 이렇게 쓰시는 것이 맞아보이네요. str형식을 decode()하는 것은 일반적이지 않죠. 물론 한방에 해결할 수 있는 unqute(string ,encoding=?) 이 더 좋지요.

깨달은 점

  • 내가 몇 시간 삽질했던 것이 바로 해결되는구나.
  • 소스코드를 꼭 확인해 보자..
  • 그리고 매뉴얼 읽는 습관을 들여야 할듯..

@neoneo40
Copy link
Author

neoneo40 commented Dec 1, 2015

삽질

  • 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!!

- 그래서 나온 것이 urlencode
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!

- [requests/test_requests.py at 6d0017ee6a242433b2a05e78ae57ae0b84ad4b13 · kennethreitz/requests · GitHub](https://github.com/kennethreitz/requests/blob/6d0017ee6a242433b2a05e78ae57ae0b84ad4b13/test_requests.py): 잘 정리되어 있으니 참고하자.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment