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 2000과 Windows XP를 포함한 Windows NT 및 그 후속 운영 체제에서는, 현재 로케일로는 표현할 수 없는 것들을 포함하여 모든 파일 이름에 직접 접근할 수 있는 와이드 문자 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”가 이를 구현하기 위한 출발점이 될 수 있습니다.
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.