2012-11-07 2 views
0

저는 사용자의 사용자 이름에 유니 코드 문자가 들어있는 포르투갈의 사용자 컴퓨터에서 Python 프로그램을 실행하고 있습니다. 내가 일부 파일 작업 결과 경로를 사용하기 때문에 os.path.expanduser('~') 반환 뭔가 기능을하고 싶은,하지만 현재 파이썬에게 유니 코드 문자열의 str 표현을 반환유니 코드 문자열의 str 표현을 유니 코드로 변환하려면 어떻게해야합니까?

>>> import os 
>>> os.path.expanduser('~') 
'C:\\Users\\V\xe2nia' 

을하지만 이것은 파이썬 문자열입니다 ... 어떻게 이 파일을 Windows가 유효한 파일 경로로 인식 할 수있는 실제 유니 코드 문자열로 변환 할 수 있습니까?

+0

'print os.path.expanduser ('~')'는 예상대로 작동하는 것 같습니다. 해석기는'repr'을 사용하여 결과를 표시합니다. – Eric

+0

@ Eric : OP가 가리키는'\ xe2' 문자가 아니라''\\''백 슬래시입니다. –

+0

@MartijnPieters : 그것은 문자열의 생성에 필요한 파이썬 리터럴을 생성하는 'repr'과 같은 또 다른 측면입니다. – Eric

답변

7

이 함수는 유니 코드 문자열이 아닌 바이트 문자열을 반환했습니다. 문자열에 사용 된 인코딩을 고려할 때 디코딩해야합니다.

os.path.expanduser('~').decode(sys.getfilesystemencoding()) 

내가 사용하는 인코딩이 sys.getfilesystemencoding()를 통해 기한 인 파일 시스템 인코딩 것을 여기에 가정을 만들고 있어요. 여기에서 라틴어 -1처럼 보이지만 확신 할 수는 없습니다.

당신은 또한 당신을 위해 디코딩을 할 os.path.expanduser()유니 코드에 전달하는 경로를 시도하고 파이썬을 가질 수

os.path.expanduser(u'~') 

Python Unicode HOWTO이 다른 유니 코드 문제에 대해 최대 읽어 보시기 바랍니다. 인코딩 된 bytestring과 유니 코드 문자열의 차이점을 이해하지 못하면 this excellent article을 읽어보십시오.

1

filesystemencoding을 사용하여 바이트 코드를 유니 코드로 디코딩하는 것은 홈 디렉토리의 경로가 실제로 filesystemencoding에서 표현 가능한 경우에만 작동합니다.

Windows에서 byte-string-file-path I/O에 사용되는 filesystemencoding은 로케일 종속적 인 'ANSI 코드 페이지'입니다. 불행하게도 UTF가 아니기 때문에 항상 사용할 수없는 문자가 있습니다. byte-string-file-path 함수로 표현됩니다. 따라서 예를 들어 사용자 이름에 일본어 문자가 포함되어 있지만 서유럽 Windows 설치 (코드 페이지 1252, ISo-8859-1과 유사)를 사용하는 경우 Martijn의 예는 실패합니다.

C 표준 라이브러리 바이트 문자열 기반 파일 입출력 기능을 사용하는 대부분의 언어에서이 기능이 끝납니다. Java 등에서는 ANSI 코드 외부에 문자가있는 파일에는 액세스 할 수 없습니다 페이지.

다행히 파이썬은 C 표준 라이브러리 대신 기본 Win32 API 호출을 사용하여 Windows의 유니 코드 파일 이름을 특정하게 지원합니다. 이를 사용하면 Windows에서 이해할 수있는 실제 유니 코드 파일 이름을 가져올 수 있으며,이를 바이트 문자열로 변환 한 후 손실되는 맹 글링을 피할 수 있습니다.

일반적으로 호출하려는 함수에 유니 코드 문자열을 전달하여 파이썬 2에서 유니 코드 파일 이름 지원을 트리거합니다. 파이썬은 응답으로 유니 코드 문자열을 반환합니다 :

>>> import os 
>>> os.path.expanduser(u'~') 
u'C:\\Users\\V\xe2nia' 
관련 문제