problem
1 2 | UnicodeEncodeError: 'latin-1' codec can't encode characters in position ... | cs |
파이썬 작업 중
UnicodeEncodeError
인코딩 에러가 계속 뜬다.인코딩 문제는 방심할 때 나타난다. 어디서 어떻게 나타날지 모른다.
그래서 오늘은 인코딩이 일어날 때 사용중이었던 모듈을 기록해두려한다.
spec
- sqlalchemy
- pymysql
- requests
- json
cause
정확히는 원인을 찾아나간 과정입니다.
1. requests의 response가 문제인 줄 알았다.
1 2 3 4 5 6 7 8 9 10 | {'data1': "???? ???? ?? ??? ?? ??? ???.'", 'data2': 'Huh? really?\n' 'huh? really?\n' '? what?\n' 'huh??\n' '? what?\n' 'huh??\n' 'huh??\n' "'Let's say. '\n", 'data3': '????? ????? ?? ??? ?? ??? ??? "'} | cs |
그래서 일단 결과값들을 decoding하기 시작..
json.loads()가 encoding, decoding을 못하는 줄 알고 온갖 인코딩, 디코딩 방법들을 시도했다.
1 2 | res.json().encode('utf-8') json.loads(res.content, encoding='utf-8') | cs |
2. mysql 테이블 character set을 잘못한 줄 알았으나 utf8_general_ci
로 잘 되있었다.
workbench에서 직접 쿼리도 때려보고,
1 2 | SHOW FULL COLUMNS FROM table_name; | cs |
를 통하여 칼럼 속성도 다시 확인해보았으나 오류를 발견하지 못했다.
3. 갑자기 쎄한 기분이 들어, sqlalchemy의 결과값, row를 찍어보았다.
역시나.. 쎄한기분은 틀리지 않는다.
1 2 | ("'???, ???'\x85?? ?? ???\n?? 2018-07-04 11:47\n?? '???'? ??[?? ?]\n(??=???) ???.") | cs |
드디어 원인을 찾았다! sqlalchemy 결과값부터가 문제였다.
여태 아무 문제없이 잘 돌고 있었는데.. 이렇게 통수를 치다니. 방심했다.
solution
원인찾기는 많이 헤맸지만 문제해결은 어렵지 않았다.
SQLAlchemy, MySQL Document 에서 바로 알 수 있다.
1 2 3 4 5 | # 방법 1 engine = create_engine('mysql+mysqldb://...', charset=utf8) # 방법 2 mysql+pymysql://{user}:{password}@{host}:3306/{database}?charset=utf8 | cs |
charset=utf8
만 붙여주면 모든 것이 평화롭다.
key point summary
sqlalchemy의 charset을 utf8로 설정해둠으로써 인코딩에 대한 우려를 접을 수 있다.
sqlalchemy 뿐만아니라 string을 다룰 땐 항상 charset, encode, decode를 조심하자. 제발.
'Python' 카테고리의 다른 글
Flask Admin (0) | 2019.06.05 |
---|---|
Python과 함께 텔레그램 챗봇 만들기(3) (0) | 2019.04.01 |
async, aiohttp로 Multipart 데이터 전송 방법 (0) | 2019.03.19 |
Python과 함께 텔레그램 챗봇 만들기(2) (0) | 2019.03.18 |
Python과 함께 텔레그램 챗봇 만들기(1) (0) | 2019.03.18 |