2009-03-21 35 views
1

GetUserNameによって返された文字列に使用されるエンコーディングをwin32 APIから取得するにはどうすればよいですか?私はpywin32を使用していて、8ビットの文字列を返します。私のドイツ語XPでは、この文字列はLatin-1を使用してコード化されていますが、これは他のWindowsインストールでは当てはまりません。GetUserName()によって返された文字列のエンコーディング

私はGetUserNameWを使うことができましたが、私はctypesを使って自分自身をラップする必要がありました。単純な解決策があれば、今は避けたいのですが。

答えて

5

GetACPに電話して、現在のANSIコードページ(UnicodeでないAPIが使用するもの)を見つけることができます。また、MultiByteToWideCharを使用して、コードページ文字列をUnicodeに変換するコードページとしてゼロを渡すこともできます(CP_ACPはWindowsヘッダーではゼロとして定義されます)。

+0

+1と答えましたが、私はまだそれがより多くの作業であっても広いAPIを使用していると私の答えを信じています。 –

+0

私はそうです!個人的には、Unicodeを使用するのが難しくなった開発環境を使用しません。 –

+0

CP_ACPのヒントをいただきありがとうございました。 –

0

APIドキュメントから、GetUserNameAはANSIの名前を返し、GetUserNameWはUnicodeの名前を返します。 GetUserNameWを使用する必要があります。

4

私は、これは直接あなたの質問に答えるされていません実現が、私はあなたが言及したようあなたはユニコード・クリーンGetUserNameWを使用しての手間を経る強くお勧めします

Windows以外のエディションでは、非ワイドコマンドの動作が異なります(例:MEですが、例は古いと認めますが)。

多言語のWindows開発を多用していますが、ワイドAPIは翻訳やラッピングのレイヤーを追加することはできますが、それは価値があります。

+0

+1。あなたは正しいですが、私はむしろpywin32に基になるUnicode対応の関数を使用したいと思います。私はそれについてのバグを提出しました、それがどのようになるかを見てみましょう。 –

3

さて、ここで私が今使っているものです:

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

mbcsは、Windowsでの特別なstandard encodingです:

Windowsのみ:ANSIコードページに従ってエンコードオペランド(CP_ACP)

+0

これはGetUserNameW()を使うこととほぼ同じですが、他の人が示唆しています。ユーザー名に、選択した "ANSI"コードページで表現できない文字が含まれている場合にのみ失敗します。 –

+0

さて、いずれかのWindowsがANSで表現できないユーザー名を持つことをユーザーが止めてしまったり、pywin32がその機能を修正しGetUserNameW;を使用しているユーザーがいないことを願っています –

関連する問題