2013-05-09 1 views
1

오른쪽 클릭 메뉴 컨텍스트를 사용할 때 Windows는 파일 경로를 원시 (바이트) 문자열 유형으로 전달합니다. 예를 들어코드 페이지를 미리 모르는 상태에서 원시 바이트 문자열을 유니 코드로 변환

: 내 응용 프로그램에서

path = 'C:\\MyDir\\\x99\x8c\x85\x8d.mp3' 

많은 외부 패키지는 unicode 유형 문자열을 기대하고, 그래서 나는 unicode로 변환해야합니다.

원시 문자열의 인코딩을 미리 알면 쉽게 될 수 있습니다 (예 : cp1255). 그러나 어떤 인코딩이 전 세계의 각 컴퓨터에서 로컬로 사용되는지는 알 수 없습니다.

stringunicode으로 변환하려면 어떻게해야하나요? 아마도 win32api을 사용하고 있을까요?

+0

ASCII는 항상 유니 코드로 변환 할 수있는 코덱입니다. 그냥'.decode ('ASCII')'입니다. ASCII가 아니라 인코딩 된 바이트를 의미합니다. –

+3

일반적으로 인코딩을 모른 채 문자열을 유니 코드로 디코딩 할 수는 없습니다. 텍스트가 ASCII가 아닌 알 수없는 인코딩입니다. – BrenBarn

+0

예가 * cp1255가 아닙니다. 해당 코덱을 사용한 디코딩이 실패합니다. UTF-16이 아니기 때문에 Windows가 파일 이름에 내부적으로 사용하는 것만 큼 놀라운 것입니다. –

답변

3

왜 ANSI (1255) 대신 DOS 코드 페이지 (862)가 표시 될지 모르겠다 - 오른쪽 클릭 옵션 설정은 어떻게되어 있습니까?

어느 쪽이든 - 인수에 임의의 유니 코드 문자를 허용해야하는 경우 Python 2의 sys.argv에서이를 수행 할 수 없습니다. 이 목록은 비 유니 코드 버전의 Win32 API (GetCommandLineA)에 의해 반환 된 바이트로 채워지며 해당 인코딩은 유니 코드로 안전하지 않습니다.

Java 및 Ruby를 비롯한 많은 다른 언어가 동일한 보트에 있습니다. 이 제한은 Microsoft C 런타임의 C 표준 라이브러리 함수 구현에서 비롯됩니다. 이 문제를 해결하려면 크로스 플랫폼 표준 라이브러리 대신 Windows에서 유니 코드 버전 (GetCommandLineW)을 호출해야합니다. 파이썬 3은 이것을합니다.

한편 Python 2의 경우에는 GetCommandLineW을 호출하여 수행 할 수 있지만 특히 좋지는 않습니다. Windows 스타일 매개 변수 분할을 원하면 CommandLineToArgvW을 사용할 수도 있습니다. win32 확장 프로그램을 사용하거나 ctypes 일반 프로그램으로이 작업을 수행 할 수 있습니다.

Example (유니 코드 문자열을 UTF-8 바이트로 다시 인코딩하는 단계는 가장 이상적입니다.)

2

보통 나는 보통 코드 페이지에서 유니 코드로 안전하게 변환하기 위해 자신의 util 함수를 사용합니다. 기본 OS 인코딩을 읽으려면 아마도 locale.getpreferredencoding 함수가 도움이 될 수 있습니다 (http://docs.python.org/2/library/locale.html#locale.getpreferredencoding). 사전 정의 된 인코딩을 반복하여 유니 코드로 변환하려고 UTIL 기능

예 :

대체 유니 함수 인수를 사용하여 오류 = "교환"에 의해 활성화 될 수
# coding: utf-8 
def to_unicode(s): 
    if isinstance(s, unicode): return s 

    from locale import getpreferredencoding 
    for cp in (getpreferredencoding(), "cp1255", "cp1250"): 
     try: 
      return unicode(s, cp) 
     except UnicodeDecodeError: 
      pass 
    raise Exception("Conversion to unicode failed") 
    # or fallback like: 
    # return unicode(s, getpreferredencoding(), "replace") 

print (to_unicode("addđšđč枎ŠĐ")) 

. 참조 http://docs.python.org/2/library/functions.html#unicode

일부 코드 페이지로 다시 변환하는 경우 this을 확인할 수 있습니다.

관련 문제