Python 3 Bytes.decode 遇到的问题— qytz-notes v0.1

文章推薦指數: 80 %
投票人數:10人

使用Python 3 的 Subprocess 模块执行shell 命令,读取到的结果的类型是 bytes ,如果是文本需要转成 str 类型。

一般来说,Linux 的中文环境大都使用utf-8 编码,我 ... qytz-notes latest Python笔记 开源代码阅读笔记 IPythonNoteBooks 技术笔记 ThePythonGTK+3Tutorial GStreamer开发经验 PycairoDocumentation D-Bus使用 shell脚本常用操作入门 JavaScript的移位运算与IP地址处理 automake和autoconf使用简明教程 Python3Bytes.decode遇到的问题 Linux粘滞位说明 mysql绿色启动方法 LDAP 系统安全的思考 VPN高级选项那些事 sphinx生成本地化的文档 简易git服务器 量化投资 瞎想 关于我 联系 qytz-notes Docs» 技术笔记» Python3Bytes.decode遇到的问题 EditonGitHub Python3Bytes.decode遇到的问题¶ 使用Python3的Subprocess模块执行shell命令,读取到的结果的类型是bytes,如果是文本需要转成str类型。

一般来说,Linux的中文环境大都使用utf-8编码,我执行操作的系统也确实使用的utf-8编码,然后还是遇到了问题…… 即使是使用了utf-8编码,我们的文件名仍然可能会产生乱码,比如我们执行ls可能会看到这样的文件名:: OITS??ѵ–????.mp4 而如果使用Subprocess模块执行ls命令,则result.decode(“utf-8”)会报UnicodeDecodeError异常, 初见这个问题我非常惊讶,应该utf-8可以编码所有的字符了吧,为啥我用utf-8decode还会出现这样的问题。

我觉得出现这个问题的原因很可能是,Linux文件系统使用的utf-8编码保存文件名,但是该文件是从Windows的文件系统拷贝过来, 而Windows文件系统的默认编码则是不是utf-8,这样我们在shell执行ls命令时显示的就是乱码字符了, 因为我们的文件系统是存的utf-8编码的文件名,自然该文件名也是按照utf-8来解码输出。

要解决这个问题也不是很麻烦,参考资料1的答案很清楚,要么使用兼容的cp437/latin-1解码,要么使用utf-8解码时进行容错处理。

>>>result=b'\xc5\xe0\xd1\xb5--\xd1\xee\xc0\xa5.mp4' >>>result.decode("utf-8",errors="surrogateescape") '\udcc5\udce0ѵ--\udcd1\udcee\udcc0\udca5.mp4' >>>result.decode("cp437") '┼α╤╡--╤ε└Ñ.mp4' >>>result.decode("latin-1") 'Åàѵ--ÑîÀ¥.mp4' 参考资料¶ ConvertbytestoaPythonstring PEP383–Non-decodableBytesinSystemCharacterInterfaces ReadtheDocs v:latest Versions latest Downloads pdf html epub OnReadtheDocs ProjectHome Builds FreedocumenthostingprovidedbyReadtheDocs.



請為這篇文章評分?