UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
2020. 2. 6. 13:50 |
리눅스
리눅스 터미널에서 파이썬 2.x 버전을 사용할 때 자주 만나는 상황이다. 주로 출력을 파이프로 넘겨 grep을 수행하거나 > 로 리다이렉트 시켜서 파일에 저장하려 할 때 발생한다.
이유는 파이썬 2.x 버전은 기본 인코딩이 ascii인데 유니코드 문자열은 UTF-8 등으로 인코딩 해줘야 파이프나 리다이렉트에서 처리할 수 있다.
[root@centos7-01 ~]# python2 -c 'import sys;print(sys.getdefaultencoding())'
ascii
[root@centos7-01 ~]# python3 -c 'import sys;print(sys.getdefaultencoding())'
utf-8
파이썬 3.x 버전은 기본 UTF-8을 사용하기 때문에 그런 문제가 발생하지 않는다.
해결책은 shell 환경변수에 PYTHONIOENCODING을 UTF-8로 선언해주는 것이다.
변경 전:
[root@centos7-01 data]# cat region_code.json | python -m json.tool | grep 서귀포
Traceback (most recent call last):
File "/usr/lib64/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/usr/lib64/python2.7/json/tool.py", line 40, in <module>
main()
File "/usr/lib64/python2.7/json/tool.py", line 35, in main
indent=4, separators=(',', ': '), ensure_ascii=False)
File "/usr/lib64/python2.7/json/__init__.py", line 190, in dump
fp.write(chunk)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
변경 후:
[root@centos7-01 data]# export PYTHONIOENCODING=UTF-8
[root@centos7-01 data]# cat region_code.json | python -m json.tool | grep 서귀포
"50130": "제주특별자치도 서귀포시"
참고로 파이썬 파일 내에서 기본 인코딩을 변경하는 방법은 아래와 같다.
import sys
reload(sys)
sys.setdefaultencoding("UTF-8")
'리눅스' 카테고리의 다른 글
리눅스 crontab date +% 포맷 작동하지 않는 경우 (1) | 2020.03.23 |
---|---|
CentOS7에서 Google Chrome + Python3 + selenium으로 웹 크롤링 기초 (0) | 2020.03.20 |
python -m json.tool 유니코드 한글 깨짐 (0) | 2020.02.06 |
리눅스 IP 주소 정렬 (0) | 2019.09.16 |
BlueStacks 4 vdi 파일 용량 축소 (1) | 2019.07.16 |
BlueStacks 4 Disk 용량 증설 (0) | 2019.07.09 |
리눅스 특정 라인 이하 삭제 (0) | 2019.05.21 |
Docker Hub 이미지 tag list 확인 방법 (0) | 2019.05.01 |
최근에 달린 댓글 최근에 달린 댓글