물론 이것은 좋은 제목은 아니지만 솔직히 말해서 질문으로 에세이를 게시하지 않고 질문을 어떻게 표현해야 할지 확신할 수 없었습니다. 이 설명은 약간의 육체를 추가해야 합니다.
문제:
Python 2.7을 사용하여 Windows에서 실행하는 Python 스크립트(내가 작성한 것이 아님)가 있습니다. 이는 비교적 기본적이며 다양한 소스에서 정보를 추출하고 출력을 터미널에 인쇄합니다. 이 출력 중 일부는 비ASCII 문자 집합의 문자를 사용하는데, 여기서 재미가 시작되었습니다.
Python 스크립트가 화면에 인쇄되는 터미널에서 제대로 실행되는 동안 파일 리디렉션을 추가하자마자 오류가 발생하고 Python 스크립트가 충돌했습니다. 많은 연구 끝에 이는 Python 2.7이 유니코드를 처리하는 방식으로 귀결되는 것으로 보였고 Python용 Windows 환경 변수를 설정하여 이 문제를 해결했습니다. 이했다:
$env:PYTHONIOENCODING="UTF-8"
PowerShell에서
Set PYTHONIOENCODING="UTF-8"
CMD에서.
좋습니다. 이제 Python 스크립트 출력을 충돌 없이 파일로 리디렉션할 수 있습니다. 문제는 두 환경이 서로 다른 결과를 가져온다는 것입니다. Python 스크립트를 실행하는 기본 형식은 다음과 같습니다.
python pythonscript.py parm1 > test.txt
이는 CMD와 PowerShell 모두에서 작동하지만 인코딩과 문자가 다른 파일이 생성됩니다. 예를 들어 문제를 일으키는 캐릭터는 입니다 ø
. CMD에서 위 줄을 실행하면 결과 파일이 UTF-8
이 문자로 인코딩되어 올바르게 표시됩니다. PowerShell에서 동일한 명령을 실행하면 (NotePad++에 표시된 대로) 파일이 인코딩되고 UCS-2 LE BOM
위 문자는 실제로 2자로 표시됩니다 ├©
.
더 이상하게도 두 환경 모두에서 리디렉션하지 않으면(즉, 터미널로 PRINT하면) 둘 다 잘못된 문자를 표시합니다.
또한 Out-file CmdLet에 대한 PowerShell 파이핑을 시도했습니다.
python pythonscript.py parm1 | out-file -encoding UTF8 test.txt
이로 인해 파일이 으로 인코딩되지만 UTF-8-BOM
여전히 잘못된 문자가 나타납니다. 여기에서 다양한 인코딩 유형을 시도해 보았는데 결국 파일 인코딩과 문자가 달라졌음에도 불구하고 아무것도 잘못된 것 같습니다.
또한 chcp
. 두 경우 모두 를 반환합니다 Active code page: 850
. PowerShell을 65001
( ) 의 코드 페이지로 설정하려고 시도했지만 utf-8
아무런 차이가 없었습니다.
그래서 나는 완전히 혼란스러워졌습니다.