PEP 277 – Windows NT의 유니코드 파일 이름 지원
- Author:
- Neil Hodgson <neilh at scintilla.org>
- Status:
- Final
- Type:
- Standards Track
- Created:
- 11-Jan-2002
- Python-Version:
- 2.3
- Post-History:
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 유니코드 파일 이름을 시스템의 와이드 문자 함수에 직접 전달하여 Windows NT에서 접근할 수 있는 모든 파일에 접근하도록 지원하는 방안을 다룹니다.
근거
Win32 플랫폼의 Python 2.2는 open과 os 모듈의 함수에 전달된 유니코드 파일 이름을 ‘mbcs’ 인코딩으로 변환한 다음, 변환한 결과를 운영 체제에 전달합니다. 이 방식은 파일을 생성할 때와 같은 로케일로 스크립트가 동작하는 일반적인 경우에는 대개 잘 동작합니다. 대부분의 컴퓨터는 로케일 하나로 설정되어 있으며, 이 로케일을 바꾸는 일은 거의 또는 전혀 없습니다. 로케일을 더 자주 바꾸는 사용자도 있으며, 서버에는 서로 다른 로케일을 쓰는 사용자들이 저장한 파일이 있는 경우가 많습니다.
Windows NT와 Windows 2000, Windows XP를 비롯한 후속 운영 체제에서는 와이드 문자 API를 사용할 수 있습니다. 이 API를 쓰면 현재 로케일로 표현할 수 없는 이름을 포함한 모든 파일 이름에 직접 접근할 수 있습니다. 이 제안의 목적은 표준 Python 파일 객체와 posix 모듈을 통해 이러한 와이드 문자 API를 사용할 수 있게 하여 Windows NT의 모든 파일에 접근할 수 있도록 하는 것입니다.
명세
와이드 문자 파일 API를 제공하는 Windows 플랫폼에서는 파일 API에 유니코드 인자가 주어지면 표준 C 라이브러리 호출과 posix 호출 대신 와이드 문자 호출을 사용합니다.
Python 파일 객체는 유니코드 파일 이름 인자를 변환하지 않고 직접 사용하도록 확장됩니다. 이 변경은 파일 객체 생성자 file(filename[, mode[, bufsize]]) 및 이 생성자의 별칭인 open 함수에 영향을 줍니다. 여기에 유니코드 파일 이름 인자를 사용하면 파일 객체의 name 속성은 유니코드가 됩니다. 파일 객체의 표현인 repr(f)는 유니코드 문자열을 표현할 때와 비슷하게 유니코드 파일 이름을 이스케이프된 문자열로 표시합니다.
posix 모듈에는 파일이나 디렉터리 이름을 받는 함수인 chdir, listdir, mkdir, open, remove, rename, rmdir, stat, _getfullpathname이 있습니다. 이 함수들은 유니코드 인자를 변환하지 않고 직접 사용합니다. rename 함수는 두 인자 중 하나라도 유니코드이면 이 동작을 적용하며, 이때 다른 인자는 기본 인코딩을 사용하여 유니코드로 변환합니다.
현재 listdir 함수는 문자열 리스트를 반환합니다. 이 제안에 따르면, 경로 인자가 유니코드일 때 이 함수는 유니코드 문자열 리스트를 반환합니다.
제약 사항
소비자용 Windows 운영 체제인 Windows 95, Windows 98, Windows ME에는 와이드 문자 파일 API가 없으므로 이 제안을 적용해도 동작이 바뀌지 않습니다. 이 운영 체제들이 사용하는 VFAT-32 파일 시스템도 유니코드 파일 이름을 지원하므로, 향후 이 제안을 이 운영 체제들까지 확장할 수 있을지도 모릅니다. 하지만 접근하기가 어려워 구현하려면 많은 작업이 필요합니다. “Microsoft Layer for Unicode”(유니코드용 Microsoft 계층)가 이를 구현하는 출발점이 될 수 있습니다.
PY_UNICODE_TYPE을 4바이트 타입으로, Py_UNICODE_SIZE를 4로 정의하면 유니코드 문자 크기를 2바이트 대신 4바이트로 설정하여 Python을 컴파일할 수 있습니다. Windows API는 4바이트 문자를 받지 않으므로 이 모드에서는 이 제안에서 설명한 기능이 동작하지 않습니다. 그래서 이 모드에서 구현은 현재의 ‘mbcs’ 인코딩 방식을 대신 사용합니다. 향후 PyUnicode_AsWideChar를 사용해 추가로 변환하면 이 제약을 없앨 수 있습니다. 하지만 지금으로서는 거의 쓰이지 않는 기능에 비해 복잡도가 너무 커집니다.
참조 구현
구현은 [2]에서 볼 수 있습니다.
참고 문헌
[1] Microsoft Windows API https://msdn.microsoft.com/
Copyright
This document has been placed in the public domain.