Python3中转换字符串编码
在使用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中转换字符串编码的更多相关文章
- Python2和Python3中的字符串编码问题解决
Python2和Python3在字符串编码上是有明显的区别. 在Python2中,字符串无法完全地支持国际字符集和Unicode编码.为了解决这种限制,Python2对Unicode数据使用了单独的字 ...
- Mapreduce中的字符串编码
Mapreduce中的字符串编码 $$$ Shuffle的执行过程,需要经过多次比较排序.如果对每一个数据的比较都需要先反序列化,对性能影响极大. RawComparator的作用就不言而喻,能够直接 ...
- Python3中的字符串函数学习总结
这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...
- 在LoadRunner中转换字符串大小写的C语言函数
在LoadRunner中转换字符串大小写的C语言函数 . loadrunner语言ccharacterstringaction 封装ConvertToXXX函数: //ConvertToUpper f ...
- 使用自己的Python函数处理Protobuf中的字符串编码
我目前所在的项目是一个老项目,里面的字符串编码有点乱,数据库中有些是GB2312,有些是UTF8:代码中有些是GBK,有些是UTF8,代码中转来转去,经常是不太清楚当前这个字符串是什么编码,由于是老项 ...
- VC++ 中使用 std::string 转换字符串编码
目录 第1章说明 1 1.1 代码 1 1.2 使用 4 第1章说明 VC++中宽窄字符串的相互转换比较麻烦,借助std::string能大大减少代码量. 1.1 代码 函数声明如下 ...
- Python3中的字符串相关操作
Python3的字符串操作相关函数详解 字符串内建函数 1. capitalize() 将字符串中的第一个字符转换成大写,其他字母变成小写.例: >>> "hello Wo ...
- 在Linux下使用iconv转换字符串编码
在Linux下写C程序,尤其是网络通信程序时经常遇到编码转换的问题,这里要用到iconv函数库. iconv函数库有以下三个函数 123456 #include <iconv.h>icon ...
- Python3中操作字符串str必须记住的几个方法
几个Python的字符串常用内建函数 1.方法:Python3 isdigit()方法 描述:Python isdigit() 方法检测字符串是否只由数字组成. 语法:str.isdigit() 参数 ...
随机推荐
- linux 命令 wc
语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同时也给出所有指定文件的总统计数.字是由空格字符区分开的最大字符串. (1) 统 ...
- shell 三剑客之 sed 命令详解
sed 编辑命令 sed 编辑命令对照表 把 /etc/passwd 文件赋值到当前路径下,进行操作 cp /etc/passwd ./ cat -n passwd sed 删除操作 删除 passw ...
- 对比centos7的systemctl和其他service+chkconfig
syetemctl就是service和chkconfig这两个命令的整合,在CentOS 7就开始被使用了.systemctl 是系统服务管理器命令,它实际上将 service 和 chkconfig ...
- unittest 运行slenium(三)---通过数据驱动形式运行用例
一: 获取数据 获取用例所在位置,通过OpenExcelPandas来读取用例里面的全部数据.通过某个列名来创建新的序号. 并将结果转换成list类型,将其作为ddt数据的来源. 1. 在test文 ...
- STM32 HAL库学习系列第8篇---回调函数总结
普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返 ...
- Bootstrap学习地址
第一步:https://www.runoob.com/bootstrap/bootstrap-tutorial.html //菜鸟教程 第二步:https://v3.bootcss.com/gett ...
- IDEA实用教程(五)——配置IDEA的JVM内存值
---恢复内容开始--- 四. 配置IDEA的JVM内存值 IDEA默认配置的JVM内存值比较低,如果硬件配置较高,可以修改该设置. 该设置需要在工程界面进行. 该操作仅建议内存8G以上,64位操作系 ...
- 基于Java+Selenium的WebUI自动化测试框架(九)-----基础页面类(BasePage)
上篇我们写了java读取xml文件的类,实现了可以从xml文件读取元素的方式.那么,接下来我们需要考虑一个问题.我们拿了这些元素之后怎么去操作呢? 先来看看我们手工测试的时候是怎么进行的. 双击浏览器 ...
- SQLSERVER视图错位的解决办法
原始需求如下: 有一个表T1 create table t1 (id int not null primary key ,v1 ) ) ,'aaa'); ,'bbb'); 有一个表TS,用于记录T1中 ...
- MySQL 空间数据 简单操作
在做的项目中需要,自己绘制区域图形,并存储起来,后面还有更新的需要,存文件不方面,想到现在数据库都支持空间数据库. 现在用的就是 MySQL ,就继续用 MySQL 来存储.管理空间数据.下面就做一些 ...