2016-08-24 4 views
1

유니 코드 코드 포인트를 포함하는 파일에서 데이터를 읽는 것과 관련된 스크립트를 실행할 때 문제가 발생합니다. 가 다른 응용 프로그램을 통해 실행될 때, 다음과 같은 오류가 제기된다유니 코드 파일 읽기시 UnicodeDecodeError 읽기

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

을 나는 정확히 같은 데이터 파일을 사용하여 동일한 코드를 실행하고 있습니다. 문제를 복제 샘플 데이터 파일은 다음과 같이이다 :

with open("sample.txt") as f: 
    for line in f: 
     print(line) 

print("Done") 

이 실행합니다

¥ Α © § 

나는 단지에서 읽고 파일 내용을 인쇄하려면이 sample.txt

아주 간단한 파이썬 스크립트를 호출 명령 줄에서 벌금; Apache/CGI를 통해 실행하면 위의 오류와 함께 실패합니다.

답변

1

문제에 대한 힌트는 open 함수의 문서에서 온 :

In text mode, if encoding is not specified the encoding used is platform dependent: locale.getpreferredencoding(False) is called to get the current locale encoding. [Link]

플랫폼 의존 제안 환경 변수. 그래서 쉘에 대해 어떤 환경 변수가 설정되어 있는지 확인한 결과 LANGen_US.UTF-8으로 설정되었습니다. Apache가 설정 한 환경 변수를 덤프하면 LANG이 누락되었습니다.

로캘을 확인할 수없는 경우 Python은 ASCII를 기본 파일 인코딩으로 사용합니다. 따라서 서수가 ASCII 범위를 벗어날 때 오류가 발생했습니다.

이 문제를 해결하려면이 환경 변수를 내 CGI 스크립트에 설정하십시오. 환경 변수가 사용자 셸에서 어떻게 든 사라지는 경우 일반적인 방법으로 설정하거나 다음을 통해 설정할 수 있습니다.

export LANG=en_US.UTF-8 

원하는 인코딩이 무엇이든간에.

사용자 셸에서 로캘이 누락 된 경우 vi와 같은 텍스트 편집기에 문자가 표시되지 않으므로 문제가 훨씬 더 두드러 질 수 있습니다. Apache (또는 다른 응용 프로그램)에서 호출했을 때만 문제가 발생했을 때 훨씬 미묘했습니다.

관련 문제