2009-03-21 2 views
1

Как получить кодировку, которая используется для строки, возвращаемой GetUserName из API win32? Я использую pywin32, и он возвращает 8-битную строку. На моей немецкой XP эта строка, очевидно, закодирована с использованием Latin-1, но это может быть не так для других установок Windows.Кодирование строки, возвращаемой GetUserName()

Я мог бы использовать GetUserNameW, но мне пришлось бы обернуть это сам использованием ctypes, чего я бы хотел избежать, если есть более простое решение.

ответ

5

Вы можете позвонить GetACP, чтобы найти текущую кодовую страницу ANSI, которую используют API-интерфейсы, отличные от Unicode. Вы также можете использовать MultiByteToWideChar и передать ноль в качестве кодовой страницы (CP_ACP определяется как ноль в заголовках Windows), чтобы преобразовать строку кодировки в Unicode.

+0

+1 для правильного ответа, но я все же верю в свой ответ об использовании широкого API, хотя это больше работает. –

+0

Так и я! Я лично не буду использовать среду разработки, которая усложнила бы использование Unicode. –

+0

Спасибо за подсказку CP_ACP, с которой я ее нашел. –

0

Из документов API GetUserNameA вернет имя в ANSI, а GetUserNameW вернет имя в Unicode. Вам нужно будет использовать GetUserNameW.

4

Я понимаю, что это не отвечает на ваш вопрос сразу, но я сильно рекомендую вам пройти через трудность использования Unicode-чистую 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: Encode операнд в соответствии с кодовой страницей ANSI (CP_ACP)

+0

Это почти эквивалентно использованию GetUserNameW(), как предложили другие. Это произойдет только тогда, когда имя пользователя содержит символы, которые не могут быть представлены на выбранной кодовой странице «ANSI». –

+0

Ну, я надеюсь, что либо Windows перестает иметь пользователей, у которых нет имени пользователя, которое не представляется в ANS, что у меня никогда не было пользователя, где это происходит, или что pywin32 исправляет свою функцию и использует GetUserNameW;) –

Смежные вопросы