在使用subprocess调用Windows命令时,遇到了字符串不显示中文的问题,源码如下:#-*-coding:utf-8-*-__author__ = '$USER'

#-*-coding:utf-8-*-
__author__ = '$USER' import subprocess
p = subprocess.Popen('nslookup www.qq.com', stdout=subprocess.PIPE)
p.wait()
print('returncode:%d' % p.returncode)
out = p.communicate()
for i in out:
if i is not None:
s = str(i, encoding='utf-8')
print(s)

输出如下:

returncode:0
File "F:/TECH/python/LearnPython100Days/subprocessSample.py", line 11, in <module>
s = str(i, encoding='utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb7 in position 0: invalid start byte

结果显示,输出变量在编码为UT-8时出错。这是因为Windows命令行使用的是GBK编码格式(可在命令行属性中查看),而不是UTF-8,因此直接进行转换是不行的。因此,将代码修改为:

s = str(i, encoding='GBK')

即可得到正确输出:

returncode:0
服务器: UnKnown
Address: 211.137.130.3 名称: https.qq.com
Addresses: 2402:4e00:8030:1::7d
121.51.142.21
Aliases: www.qq.com

在项目中,为了避免出现乱码,最好将所有的输出全部统一为UTF-8格式。那么,如何实现呢?

1.使GBK将字节串编码为中文;

2.使用UTF-8将中文字符串编码为字节串;

3.使用UTF-8将该字节串解码为字符串,即得到一串中文。

相关代码如下:

for i in out:
if i is not None:
print('原始字节串(%s):\n%s' %(chardet.detect(i)['encoding'],i))
s = str(i, encoding='GBK')
print('中文字符串:\n%s' %s)
utf8_bytes = s.encode('UTF-8', 'ignore')
print('转码后的字节串(%s):\n%s' % (chardet.detect(utf8_bytes)['encoding'], utf8_bytes))
utf8_str = utf8_bytes.decode('UTF-8')
print('转码后的中文字符串:\n%s' %utf8_str)

  

输出如下:

returncode:0
原始字节串(ISO-8859-9):
b'\xb7\xfe\xce\xf1\xc6\xf7: UnKnown\r\nAddress: 211.137.130.3\r\n\r\n\xc3\xfb\xb3\xc6: https.qq.com\r\nAddresses: 2402:4e00:8030:1::7d\r\n\t 121.51.142.21\r\nAliases: www.qq.com\r\n\r\n'
中文字符串:
服务器: UnKnown
Address: 211.137.130.3 名称: https.qq.com
Addresses: 2402:4e00:8030:1::7d
121.51.142.21
Aliases: www.qq.com 转码后的字节串(utf-8):
b'\xe6\x9c\x8d\xe5\x8a\xa1\xe5\x99\xa8: UnKnown\r\nAddress: 211.137.130.3\r\n\r\n\xe5\x90\x8d\xe7\xa7\xb0: https.qq.com\r\nAddresses: 2402:4e00:8030:1::7d\r\n\t 121.51.142.21\r\nAliases: www.qq.com\r\n\r\n'
转码后的中文字符串:
服务器: UnKnown
Address: 211.137.130.3 名称: https.qq.com
Addresses: 2402:4e00:8030:1::7d
121.51.142.21
Aliases: www.qq.com

  

注意:

1.字节串转为GBK,再使用UTF-8转为字节串后,其值发生了变化;

2.使用chardet模块能够检测字节串的编码类型,但是它的结果不保证准确,仅供参考。它将第一个字节串检测成了‘ISO-8859-9’

3.在phthon3中,字符串的encode()方法能够得到字节串,没有decode方法;相应地,字节串bytes.decode()方法将其解码为字符串,没有encode方法。这里与python2不一样。

Python3中转换字符串编码的更多相关文章

  1. Python2和Python3中的字符串编码问题解决

    Python2和Python3在字符串编码上是有明显的区别. 在Python2中,字符串无法完全地支持国际字符集和Unicode编码.为了解决这种限制,Python2对Unicode数据使用了单独的字 ...

  2. Mapreduce中的字符串编码

    Mapreduce中的字符串编码 $$$ Shuffle的执行过程,需要经过多次比较排序.如果对每一个数据的比较都需要先反序列化,对性能影响极大. RawComparator的作用就不言而喻,能够直接 ...

  3. Python3中的字符串函数学习总结

    这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...

  4. 在LoadRunner中转换字符串大小写的C语言函数

    在LoadRunner中转换字符串大小写的C语言函数 . loadrunner语言ccharacterstringaction 封装ConvertToXXX函数: //ConvertToUpper f ...

  5. 使用自己的Python函数处理Protobuf中的字符串编码

    我目前所在的项目是一个老项目,里面的字符串编码有点乱,数据库中有些是GB2312,有些是UTF8:代码中有些是GBK,有些是UTF8,代码中转来转去,经常是不太清楚当前这个字符串是什么编码,由于是老项 ...

  6. VC++ 中使用 std::string 转换字符串编码

    目录 第1章说明    1 1.1 代码    1 1.2 使用    4 第1章说明 VC++中宽窄字符串的相互转换比较麻烦,借助std::string能大大减少代码量. 1.1 代码 函数声明如下 ...

  7. Python3中的字符串相关操作

    Python3的字符串操作相关函数详解 字符串内建函数 1. capitalize() 将字符串中的第一个字符转换成大写,其他字母变成小写.例: >>> "hello Wo ...

  8. 在Linux下使用iconv转换字符串编码

    在Linux下写C程序,尤其是网络通信程序时经常遇到编码转换的问题,这里要用到iconv函数库. iconv函数库有以下三个函数 123456 #include <iconv.h>icon ...

  9. Python3中操作字符串str必须记住的几个方法

    几个Python的字符串常用内建函数 1.方法:Python3 isdigit()方法 描述:Python isdigit() 方法检测字符串是否只由数字组成. 语法:str.isdigit() 参数 ...

随机推荐

  1. vue中组件之间的通信

    一.vue中组件通信的种类 父组件向子组件的通信 子组件向父组件的通信 隔代组件之间的通信 兄弟 组件 之间的通信 二.实现通信的方式  props vue自定义的事件 消息订阅与发布 vuex sl ...

  2. CSS重排和重绘

    一.什么是重绘Repaint和重排 (回流 reflow) 重绘:当元素的一部分属性发生改变,如外观.背景.颜色等不会引起布局变化,只需要浏览器根据元素的新属性重新绘制 ,使元素呈现新的外观叫做重绘. ...

  3. oracle:sql添加合计语句(union)

    转自:https://blog.csdn.net/qq_43563538/article/details/90370925 原表见下图: 查询全部的语句: SELECT * from BD_MARK_ ...

  4. OpenStack kilo版(7) 部署dashboard

    安装dashboard  root@controller:~# apt-get install openstack-dashboard  配置 /etc/openstack-dashboard/loc ...

  5. Centos 6.5 Apache服务安装

     Apache是什么: Apache HTTP Server(简称Apache)是Apache软件基金会的一个高性能.功能强大.稳定可靠.又很灵活的开发源代码的web服务软件,对linux的支持相对好 ...

  6. VSCode Git 没有活动的源代码控制提供程序

    主要原因:我以前安装的Git只允许在Git-Bash中运行,需要重新安装Git,选择允许三方软件的那个选项,然后安装Git插件,修改git.path即可. 以下是解决过程中的尝试,记录如下,实际上只需 ...

  7. django内置缓存

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...

  8. mr-robot靶机练习

    在业余时间进行的靶机练习,也是根据网上的大牛做下来的,重复造轮子吧,但是个人感觉还是即使是造轮子也是需要自己动手呀,毕竟每个人做的过程中遇到的问题是不一样的,这样既可以帮助别人也能锻炼自己.希望可以帮 ...

  9. 运维开发笔记整理-template的使用

    运维开发笔记整理-Django的template的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在上一篇博客中我们学习了HttpResponse 和JsonResponse方 ...

  10. vim配置笔记

    1. vim两种配置方法 1)配置文件 全局配置文件:/etc/vim/vimrc或者/etc/vimrc 用户个人配置文件:~/.vimrc 2)命令模式 命令行模式下直接输入配置命令即可.如:se ...