为什么会发生以下情况:
>>> u'\u0308'.encode('mbcs') #UMLAUT
'\xa8'
>>> u'\u041A'.encode('mbcs') #CYRILLIC CAPITAL LETTER KA
'?'
>>>
Run Code Online (Sandbox Code Playgroud)
我有一个Python应用程序接受操作系统的文件名.它适用于一些国际用户,但不适用于其他用户.
例如,这个unicode文件名:u'\ u041a\u0433\u044b\u044b\u0448\u0444\u0442'
不会使用Windows的'mbcs'编码进行编码(文件系统使用的编码,由sys.getfilesystemencoding()返回).我得到'???????',表示编码器在这些字符上失败.但这没有任何意义,因为文件名来自用户开始.
更新:这是我背后原因的背景...我的系统上有一个文件,名字是西里尔文.我想用该文件作为参数调用subprocess.Popen().Popen不会处理unicode.通常情况下,我可以使用sys.getfilesystemencoding()给出的编解码器对参数进行编码.在这种情况下,它将无法正常工作
我正在开发一个python应用程序,可以在多个平台上以多种语言将文本打印到控制台.该程序适用于所有UNIX平台,但在Windows中,在命令行中打印unicode字符串时出错.
已经有一个相关的线程:( Windows cmd编码更改导致Python崩溃)但我找不到我的具体答案.
例如,对于以下亚洲文本,在Linux中,我可以运行:
>>> print u"\u5f15\u8d77\u7684\u6216".encode("utf-8")
????
Run Code Online (Sandbox Code Playgroud)
但在Windows中,我得到:
>>> print u"\u5f15\u8d77\u7684\u6216".encode("utf-8")
?????????µ??
Run Code Online (Sandbox Code Playgroud)
在做类似的事情时,我成功地用消息框显示正确的文本:
>>> file("bla.vbs", "w").write(u'MsgBox "\u5f15\u8d77\u7684\u6216", 4, "MyTitle"'.encode("utf-16"))
>>> os.system("cscript //U //NoLogo bla.vbs")
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够在Windows控制台中完成它,并且最好 - 在我的python代码之外不需要太多配置(因为我的应用程序将分发给许多主机).
这可能吗?
编辑:如果不可能 - 我很乐意接受在Windows中显示unicode编写控制台应用程序的其他一些建议,例如另一个Windows控制台的python实现