将原始字节string转换为Unicode,而不必事先知道代码页

当使用右键单击菜单上下文时,Windows以原始(字节)stringtypes传递文件path。

例如:

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

我的应用程序中的许多外部程序包都需要unicodetypes的string,所以我必须将其转换为unicode

如果我们事先知道原始string的编码(在这个例子中是cp1255 ),那将很容易。 但是我不知道在全世界每台计算机上本地使用哪种编码。

我怎样才能将string转换为unicode ? 也许使用win32api是必要的?

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

无论哪种方式 – 如果你需要接受你的参数中的任何Unicode字符,你不能从Python 2的sys.argv 。 这个列表是从非Unicode版本的Win32 API( GetCommandLineA )返回的字节填充的,而且这种编码从来就不是Unicode安全的。

包括Java和Ruby在内的许多其他语言都在同一条船上。 限制来自Microsoft C运行时的C标准库函数的实现。 为了解决这个问题,可以在Windows上调用Unicode版本( GetCommandLineW ),而不是依赖跨平台标准库。 Python 3这样做。

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

示例 (虽然将Unicode字符串编码回UTF-8字节的步骤最好略过)。

通常我使用自己的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

为了转换回一些代码页,你可以检查这一点 。