1

When using the right-click menu context, windows passes file path as raw (byte) string type.

For example:

path = 'C:\\MyDir\\\x99\x8c\x85\x8d.mp3'

Many external packages in my application are expecting unicode type strings, so I have to convert it into unicode.

That would be easy if we'd known the raw string's encoding beforehand (In the example, it is cp1255). However I can't know which encoding will be used locally on each computer around the world.

How can I convert the string into unicode? Perhaps using win32api is needed?

4

2 回答 2

3

不知道为什么您可能会得到 DOS 代码页 (862) 而不是 ANSI (1255) - 如何设置右键单击选项?

无论哪种方式 - 如果您需要在参数中接受任意 Unicode 字符,则无法从 Python 2 的sys.argv. 此列表由 Win32 API ( ) 的非 Unicode 版本返回的字节填充GetCommandLineA,并且该编码绝不是 Unicode 安全的。

包括 Java 和 Ruby 在内的许多其他语言也在同一条船上。限制来自 Microsoft C 运行时对 C 标准库函数的实现。要修复它,可以GetCommandLineW在 Windows 上调用 Unicode 版本 ( ),而不是依赖跨平台标准库。Python 3 做到了这一点。

同时对于 Python 2,您可以通过调用GetCommandLineW自己来完成,但这并不是特别漂亮。CommandLineToArgvW如果你想要 Windows 风格的参数 splittng,你也可以使用。您可以使用win32扩展名或简单ctypes的 .

示例(尽管最好跳过将 Unicode 字符串编码回 UTF-8 字节的步骤)。

于 2013-05-09T22:54:33.310 回答
2

通常我使用自己的 util 函数来安全地将普通代码页转换为 unicode。对于读取默认操作系统编码,可能locale.getpreferredencoding函数可能会有所帮助(http://docs.python.org/2/library/locale.html#locale.getpreferredencoding)。

试图通过迭代一些预定义编码来转换为 unicode 的 util 函数示例:

# coding: utf-8
def to_unicode(s):
    if isinstance(s, unicode): return s

    from locale import getpreferredencoding
    for cp in (getpreferredencoding(), "cp1255", "cp1250"):
        try:
            return unicode(s, cp)
        except UnicodeDecodeError:
            pass
    raise Exception("Conversion to unicode failed")
    # or fallback like:
    # return unicode(s, getpreferredencoding(), "replace")

print (to_unicode("addđšđč枎ŠĐ"))

可以使用 unicode 函数参数 errors="replace" 启用回退。参考http://docs.python.org/2/library/functions.html#unicode

要转换回某些代码页,您可以检查this

于 2013-05-09T19:42:18.313 回答