2009-03-21 6 views
1

Wie bekomme ich die Codierung, die für die Zeichenfolge GetUserName aus der Win32-API verwendet wird? Ich benutze pywin32 und es gibt eine 8-Bit-Zeichenfolge zurück. Auf meinem deutschen XP ist diese Zeichenfolge offensichtlich mit Latin-1 codiert, aber dies ist bei anderen Windows-Installationen möglicherweise nicht der Fall.Codierung der zurückgegebenen Zeichenfolge von GetUserName()

Ich könnte GetUserNameW verwenden, aber ich würde das selbst wickeln mit Ctypes, die ich für jetzt vermeiden möchte, wenn es eine einfachere Lösung gibt.

Antwort

5

Sie können GetACP aufrufen, um die aktuelle ANSI-Codepage zu finden, die von Nicht-Unicode-APIs verwendet wird. Sie können auch MultiByteToWideChar verwenden und Null als Codepage übergeben (CP_ACP ist in den Windows-Headern als Null definiert), um eine Codepagezeichenfolge in Unicode zu konvertieren.

+0

+1 für die richtige Antwort, aber ich glaube immer noch an meine Antwort der Verwendung der breiten API, obwohl es mehr Arbeit ist. –

+0

Ich auch! Ich persönlich würde keine Entwicklungsumgebung verwenden, die die Verwendung von Unicode erschweren würde. –

+0

Danke für den Hinweis auf CP_ACP, damit habe ich es gefunden. –

0

Von den API-Dokumenten gibt GetUserNameA den Namen in ANSI zurück und GetUserNameW gibt den Namen in Unicode zurück. Sie müssen GetUserNameW verwenden.

4

Ich weiß, dies ist Ihre Frage nicht direkt beantworten, aber ich stark empfehlen Ihnen die Mühe durch den Unicode-clean GetUserNameW verwenden, wie Sie erwähnt.

Die nicht-breiten Befehle funktionieren anders auf verschiedenen Windows-Editionen (z. B. ME, obwohl ich zugeben, dass Beispiel ist alt!), Also IMHO es lohnt sich, es richtig zu machen.

Nach einer vielsprachigen Windows-Entwicklung, obwohl die breite API eine Schicht von Übersetzung oder Verpackung hinzufügen kann (wie Sie vorschlagen!), Es ist es wert.

+0

+1. Sie haben recht, aber ich möchte lieber pywin32 die zugrunde liegende Unicode-ready-Funktion verwenden. Ich habe einen Fehler dafür eingereicht, mal sehen, wie sich das herausstellt. –

3

Okay, hier ist, was ich jetzt bin mit:

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

mbcs ist eine spezielle standard encoding in Windows:

Nur Windows: Encode Operanden gemäß dem ANSI-Codepage (CP_ACP)

+0

Das entspricht fast der Verwendung von GetUserNameW(), wie andere vorgeschlagen haben. Es wird nur fehlschlagen, wenn der Benutzername Zeichen enthält, die auf der ausgewählten "ANSI" -Codepage nicht dargestellt werden können. –

+0

Nun, ich hoffe, dass entweder Windows verhindert, dass Benutzer einen Benutzernamen haben, der in ANS nicht darstellbar ist, dass ich nie einen Benutzer habe, wo das der Fall ist oder dass pywin32 ihre Funktion behebt und GetUserNameW verwendet; –