2016-10-14 5 views
0

내 Django 앱이 시작할 때 (또는 관리 명령을 실행할 때) 일부 파일을로드합니다. 내 아치 또는 우분투 시스템 중 하나에서 ssh를 사용하여 정상적으로 작동하면 명령 및 마이그레이션을 성공적으로 실행할 수 있습니다. 나는 OS의 X에서 ssh를 할 때OS X에서 ssh 때 UnicodeDecodeError

하지만 (나는 엘 자본이) 나는이 오류가 같은 일을하려고 :

UnicodeDecodeError: 'ASCII' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 

오류가 때 발생하는 나는 with open(path_to_file) as f: ...

를 사용하여 내 파일을 열려면 iterm과 터미널 모두에서 sshing. 그 이유는 LC_CTYPE 환경 변수라는 것을 알게되었습니다. 내 다른 리눅스 컴퓨터에서는 설정되지 않았지만 맥에서 그것은 UTF-8이었습니다. 그래서 서버에 ssh를 실행 한 후에도 똑같이 설정되었습니다. LC_CTYPE 설정을 해제하면 오류가 해결되었습니다.

실제 문제는 무엇이 발생 했는가와이를 더 이상 피하는 방법입니다. 내 로컬 컴퓨터에서이 변수의 설정을 해제 할 수 있지만 몇 가지 부정적인 영향이 있습니까? 그리고 이것을하는 가장 좋은 방법은 무엇입니까?

답변

0

로컬 컴퓨터의 터미널에 문자 인코딩이 사용됩니다. 사용하는 인코딩은 UTF-8 인 것으로 보입니다. 서버에 로그온하면 (BTW, 어떤 OS가 실행됩니까?) 거기에서 실행되는 프로그램은 터미널이 지원하는 인코딩을 알아야 필요에 따라 물건을 표시 할 수 있습니다. 그들은 LC_CTYPE에서이 정보를 얻습니다. ssh은 터미널을 지원하기 때문에 UTF-8로 올바르게 설정합니다.

LC_CTYPE의 설정을 해제하면 프로그램에서 기본값 인 ASCII을 사용합니다. 이제는 UTF-8ASCII과 역 호환되기 때문에 프로그램이 UTF-8 대신 ASCII에 표시됩니다. 그러나 프로그램에서 ASCII에 존재하지 않는 특수 문자를 표시해야하는 경우에는 작동하지 않습니다.

당신이 제공 한 정보에서 시스템이 왜 이런 식으로 행동하는지 분명하지 않지만, LC_CTYPE을 설정하면 좋지 않은 해결 방법이라고 말할 수 있습니다. 앞으로 문제가 발생하지 않도록하려면 모든 시스템의 모든 터미널이 UTF-8을 사용하고 ASCII를 제거하는 것이 좋습니다.

파일을 open (으)로하면 파이썬은 터미널의 (즉 LC_CTYPE의) 문자 집합을 사용합니다. 왜 이런 식으로 만들어 졌는지 나는 결코 이해하지 못했습니다. 왜 터미널의 문자 세트가 파일의 인코딩을 나타내야합니까? 그러나 그것이 만들어진 방법이며 올바르게 문제를 해결하는 방법은 파이썬 3을 사용하는 경우 매개 변수를 사용하거나 파이썬 2를 사용하는 경우 codecs 표준 라이브러리 모듈을 사용하는 것입니다.

+0

사실 나는 단지 봤습니다. 'UTF-8'은 유효한 LC_CTYPE이 아니므로'export LC_ALL = en_US.UTF-8' 및'LANG = en_US.UTF-8'을 내'.bash_profile'에 추가하고 문제를 해결했습니다. Btw 나는 우분투 16.04를 서버 머신으로 사용한다. 그리고 나는 파일 인코딩을 정의하기 위해 공개적으로 사용하는 LC_CTYPE을 알지 못했습니다. 실제로 이상합니다. 고마워. 나는 당신의 대답을 받아 들일 것입니다. – valignatev