유니코드 코드 포인트와 유용한 문자 집합의 문자 이름을 터미널(xfce4-terminal)에 출력하는 Python 스크립트가 있습니다. 조금 커져서 grep을 통해 출력을 파이핑하려고 시도했는데 결과에 놀랐습니다.파이썬실수. grep 오류는 나를 놀라게 하지 않을 것입니다. 나는 grep이 유니코드 입력에 대해 설정되지 않았다고 가정합니다.
오류에 대한 간단한 한 줄 데모:
python -c 'print "diameter "+ unichr(0x2300)'|grep 'd'
반품
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2300' in position 9:
ordinal not in range(128)`
내 기본 Python은 Python 2(Xubuntu 18.04 및 많은 이전 Python 2 코드)입니다. 다음에 추가
# -*- coding: utf-8 -*-
스크립트에는 차이가 없습니다(스크립트가 모두 ASCII 형식이므로 차이가 있어서는 안 됩니다).
스크립트를 Python 3으로 업데이트하고 python3 -c 'print ("diameter "+ unichr(0x2300))'|grep 'd'
정상적으로 실행하면. 이는 명시적으로 python3을 호출하고 스크립트를 실행 가능하게 만드는 shebang도 작동한다는 것을 의미합니다. 문제를 해결할 수는 있지만 무슨 일이 일어나고 있는지 궁금합니다.
Python 2는 터미널에 직접 출력하는 것이 아니라 grep으로 출력을 파이프하고 계속 다르게 실행된다는 것을 어떻게 그리고 왜 알 수 있습니까?
답변1
프로그램이 표준 출력이 터미널이나 다른 장치에 연결되어 있는지 여부를 감지하는 것은 드문 일이 아닙니다. 기능isatty()
posix의 일부입니다그리고 꽤 많이 사용했습니다.
매우 일반적인 예는 다음 두 명령 간의 출력이 상당히 다르다는 것입니다.
ls
ls | cat
python2의 경우 Python에서 사용하는 기본 인코딩으로 변경된 것처럼 보입니다. https://stackoverflow.com/questions/2276200/changing-default-encoding-of-python/7892892#7892892
이는 분명히 의식적인 디자인 결정이지만 그 장점이 무엇인지는 확실하지 않습니다.
참조 답변의 제안은 다음을 설정하는 것입니다.PYTHONIOENCODING
Python2는 가치가 하락되었습니다.. 어쨌든 Python 3으로 전환해 보세요.
이것이 왜 다른지에 대한 질문에 대답하지는 않지만 Google에서 몇 가지 간단한 검색을 하면 왜 실패하는지 알 수 있습니다. 이 스택 오버플로 답변이 문서의 첫 번째 예를 가리킵니다.
https://docs.python.org/2/library/functions.html#unichr
즉, 유니코드 문자열을 Askii 문자열에 추가하기 전에 바이트로 변환하지 마십시오.