【问题标题】:Encoding of string returned by GetUserName()GetUserName() 返回的字符串编码
【发布时间】:2009-03-21 18:51:08
【问题描述】:

如何从 win32 API 获取用于GetUserName 返回的字符串的编码?我正在使用 pywin32,它返回一个 8 位字符串。在我的德语 XP 上,这个字符串显然是使用 Latin-1 编码的,但对于其他 Windows 安装可能不是这样。

我可以使用 GetUserNameW,但我必须自己使用 ctypes 来包装它,如果有更简单的解决方案,我想暂时避免使用。

【问题讨论】:

    标签: python winapi encoding pywin32


    【解决方案1】:

    您可以调用GetACP 来查找当前的ANSI 代码页,这是非Unicode API 使用的。您也可以使用MultiByteToWideChar,并将零作为代码页(CP_ACP 在 Windows 标头中定义为零)将代码页字符串转换为 Unicode。

    【讨论】:

    • +1 表示正确答案,但我仍然相信我使用宽 API 的答案,即使它需要更多工作。
    • 我也是!我个人不会使用任何使 Unicode 更难使用的开发环境。
    • 感谢 CP_ACP 的提示,我找到了。
    【解决方案2】:

    我知道这并不是直接回答您的问题,但我强烈建议您按照您提到的那样使用 Unicode-clean GetUserNameW

    非宽命令在不同的 Windows 版本上的工作方式不同(例如 ME,虽然我承认这个例子很旧!),所以恕我直言,把它做对是值得的。

    做过很多多语言的 Windows 开发,虽然宽 API 可以加一层翻译或包装(如​​你所言!),还是值得的。

    【讨论】:

    • +1。你是对的,但我宁愿让 pywin32 使用底层的 Unicode-ready 函数。我已经为此提交了一个错误,让我们看看结果如何。
    【解决方案3】:

    好的,这就是我现在使用的:

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

    mbcs 在 Windows 中是一个特殊的standard encoding

    仅限 Windows:根据 ANSI 代码页 (CP_ACP) 对操作数进行编码

    【讨论】:

    • 这几乎等同于其他人建议的使用 GetUserNameW() 。仅当用户名包含无法在所选“ANSI”代码页中表示的字符时才会失败。
    • 好吧,我希望 Windows 阻止用户使用在 ANS 中无法表示的用户名,我从来没有这样的用户,或者 pywin32 修复了他们的功能并使用 GetUserNameW ;)
    【解决方案4】:

    从 API 文档中,GetUserNameA 将以 ANSI 格式返回名称,而 GetUserNameW 将以 Unicode 格式返回名称。您必须使用 GetUserNameW。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2023-03-21
      相关资源
      最近更新 更多