当使用右键单击菜单上下文时,Windows以原始(字节)stringtypes传递文件path。
例如:
path = 'C:\\MyDir\\\x99\x8c\x85\x8d.mp3'
我的应用程序中的许多外部程序包都需要unicode
types的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
为了转换回一些代码页,你可以检查这一点 。