리눅스 터미널에서 파이썬 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")