2009-03-21 3 views
1

GetUserName에 의해 반환 된 문자열에 사용되는 인코딩을 win32 API에서 가져 오는 방법은 무엇입니까? 저는 pywin32를 사용하고 있으며 8 비트 문자열을 반환합니다. 내 독일어 XP에서이 문자열은 Latin-1을 사용하여 분명히 인코딩되지만 다른 Windows 설치에서는 그렇지 않을 수 있습니다.GetUserName()에 의해 반환 된 문자열의 인코딩

나는 GetUserNameW을 사용할 수 있지만 ctypes를 사용하여 직접 작성해야합니다. 간단한 해결책이 있으면 지금 피하고 싶습니다.

답변

5

GetACP을 호출하여 비 유니 코드 API에서 사용하는 현재 ANSI 코드 페이지를 찾을 수 있습니다. 또한 MultiByteToWideChar을 사용하고 코드 페이지 문자열을 유니 코드로 변환하기 위해 코드 페이지로 0을 전달할 수 있습니다 (CP_ACP는 Windows 헤더에서 0으로 정의 됨).

+0

+1 답변이 더 많습니다. 그러나 더 많은 작업이 있더라도 넓은 API를 사용하는 것에 대한 제 대답은 여전히 ​​믿습니다. –

+0

그래서 나! 필자는 개인적으로 유니 코드를 사용하기가 더 어려워진 개발 환경을 사용하지 않을 것입니다. –

+0

CP_ACP에 대한 힌트를 주셔서 감사합니다. –

0

API 문서에서 GetUserNameA는 ANSI의 이름을 반환하고 GetUserNameW는 유니 코드의 이름을 반환합니다. GetUserNameW를 사용해야합니다.

4

이 질문에 직접 대답하지 않는 것을 알고 있지만, 강력하게은 말한대로 유니 코드 클린 GetUserNameW을 사용하는 것이 좋습니다.

비 와이드 명령은 다른 Windows 버전에서 다르게 작동합니다 (예 : ME는 오래된 것으로 인정하지만!). IMHO는 가치가 있습니다.

다국어 Windows 개발을 많이 했으므로 와이드 API는 번역이나 래핑 레이어를 추가 할 수 있지만 (가치가 있습니다!), 그만한 가치가 있습니다.

+0

+1. 당신 말이 맞아요,하지만 pywin32는 기본 Unicode-ready 함수를 사용하고 싶습니다. 나는 그것에 대한 버그를 제기했다. 어떻게되는지 알아 보자. –

3

좋아, 내가 지금 사용하고있는 작업은 다음과 같습니다

>>> import win32api 
>>> u = unicode(win32api.GetUserName(), "mbcs") 
>>> type(u) 
<type 'unicode'> 

mbcs 윈도우에서 특별한 standard encoding입니다 :

윈도우 전용 : ANSI 코드 페이지에 따라 인코딩 피연산자 (CP_ACP)

+0

다른 사람들이 제안한 것처럼 GetUserNameW()를 사용하는 것과 거의 같습니다. 선택한 "ANSI"코드 페이지에서 표시 할 수없는 문자가 사용자 이름에 포함 된 경우에만 오류가 발생합니다. –

+0

글쎄, 어느 Windows가 ANS에서 표현할 수없는 사용자 이름을 가지지 못하게하거나, 사용자가 없거나 pywin32가 자신의 기능을 수정하고 GetUserNameW를 사용하는 것을 막을 수 있기를 바랍니다. –

관련 문제