在使用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. ECMAScript5面向对象技术(2)--函数

    在JavaScript中,函数其实就是对象.使函数不同于其他对象的决定性特点是函数存在一个被称为[[Call]]的内部属性.内部属性无法通过代码访问而是定义了代码执行时的行为.ECMAScript为J ...

  2. Python函数Day3

    一.函数名的应用 函数名类似于特殊的变量,打印函数名就是打印函数的内存地址 ① 函数名就是函数的内存地址 def func(): pass >>>func <function ...

  3. Windows10 临时将线程绑定至指定CPU的方法

    本文首发:https://www.somata.work/2019/WindowsThreadBind.html 将线程绑定至指定CPU,这个应该时很多管理员需要了解认知的操作了吧,这样可以在一定程度 ...

  4. Mybatis.NET Oracle 线上神奇问题:Value does not fall within the expected range.

    1.错误现象 在向数据库查询一条数据的时候报如下错误: Value does not fall within the expected range. at Oracle.ManagedDataAcce ...

  5. jade注释

    在jade里面注释是有多种方式的 单行注释,加两个//,跟js里面一样 //h1.title#title imoock jade study => <!--h1.title#title i ...

  6. G1垃圾收集器堆内存划分与角色分派【纯理论】

    接着上一次[https://www.cnblogs.com/webor2006/p/11123522.html]G1学习继续开启理论之旅.. G1的设计规划是要替换掉CMS[理想化的] G1在某些方面 ...

  7. blind XXE payload

    简单验证 POST /test HTTP/1.1 Content-Type: application/soap+xml User-Agent: scanner Accept: */* Cache-Co ...

  8. Centos 改ssh 端口

    1.修改配置文件:/etc/ssh/sshd_config 2.修改 #Port 22 把前面的#注释删掉,然后添加一个Port XXXX 定义一个自己的.例如我喜欢 Port 22333 3.修改后 ...

  9. javascript权威指南第21章 Ajax和Comet

    function createXHR(){ if(typeof XMLHttpRequest !='undefined'){ return new XMLHttpRequest(); }else if ...

  10. Java中static用来计数

    搓搓的代码 import java.util.ArrayList; import java.util.Iterator; class Student{ private static int num; ...