python字符集分析,解决windows下FTPClient下载中文名称文件乱码

python中的中文编码一直以来都是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢?在python中提到unicode,一般指的是unicode对象,例如‘哈哈‘的unicode对象为u‘\u54c8\u54c8‘,而str,是一个字节数组,这个字节数组表示的是对unicode对象编码(可以是utf-8、gbk、cp936、GB2312)后的存储的格式。这里它仅仅是一个字节流,没有其它的含义,如果你想使这个字节流显示的内容有意义,就必须用正确的编码格式,解码显示

例如:

>>> A = u"你好"
>>> A_UTF8 = A.encode("utf-8")
>>> print A_UTF8
浣犲ソ
>>> A_GBK = A.encode("gbk")
>>> print A_GBK
你好
>>> A_UTF8
‘\xe4\xbd\xa0\xe5\xa5\xbd‘
>>> A_GBK
‘\xc4\xe3\xba\xc3‘

对于unicode对象"你好"进行编码,编码成一个utf-8编码,A_UTF8就是是一个字节数组,存放的就是‘\xe4\xbd\xa0\xe5\xa5\xbd‘,但是这仅仅是一个字节数组,不能通过print语句输出成你好.因为print语句它的实现是将要输出的内容传送了操作系统,操作系统会根据系统的编码对输入的字节流进行编码,这就解释了为什么utf-8格式的字符串"你好",输出的是"浣犲ソ",因为 ‘\xe4\xbd\xa0\xe5\xa5\xbd‘用GB2312去解释,其显示的出来就是"浣犲ソ"。str记录的是字节数组,只是某种编码的存储格式,至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。这里再对print进行一点补充说明:当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,转换成本地的默认编码(可能是这样子的)

decode和encode

字符串在Python内部的表示是unicode编码,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。            例:str1.decode(‘gb2312‘),表示将gb2312编码的字符串str1转换成unicode

str2.encode(‘gb2312‘),表示将unicode编码的字符串str2转换成gb2312编码。

转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码,在utf8的文件中,该字符串就是utf8编码,如果是在gbk的文件中,则其编码为gbk。这种情况下,要进行编码转换,都需 要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。

如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:
    isinstance(s, unicode) #用来判断是否为unicode

例子:解决windows下python FTPClient下载中文文件名出错的问题

def downloadfile():
    remotepath = os.path.join(remotepath, Zname).encode(‘utf-8‘)
    localpath = CreatDir()
    localpath = os.path.join(localpath, Zname).encode("gbk")
    print "开始连接FTP服务器..."
    ftp = ftpconnect()
    ftp.set_debuglevel(2) #打开调试
    #print ftp.getwelcome() #显示ftp服务器欢迎信息
    bufsize = 1024 #设置缓冲块大小
    try:
        print "开始接收服务器上的文件..."
        fp = open(localpath.decode(‘gbk‘), ‘wb‘) #以写模式在本地打开文件
        ftp.retrbinary(‘RETR ‘ + remotepath,fp.write,bufsize) #接收服务器上文件并写入本地文件
        logging.debug("读取远程地址为%s" % remotepath.decode("utf8").encode("gbk"))
        logging.debug("%s下载成功路径为: %s" %(Zname, localpath))
        print "%s下载成功路径为: %s" %(Zname, localpath)
        fp.close()
    except Exception, e:
        print e
        logging.debug("%s下载失败关闭文件,退出FTP服务器" %Zname)
        print "下载失败"
        os.remove(localpath)
    finally:
        ftp.quit() #退出ftp服务器
时间: 2024-08-10 15:10:15

python字符集分析,解决windows下FTPClient下载中文名称文件乱码的相关文章

解决windows下FileZilla server中文乱码问题

最利用cuteftppro FTP做文件夹同步,发现中文的文件夹及文件名都出现了乱码问题, 一开始以为是cuteftppro的问题,谷哥度娘找了一堆的解决方案都没有解决乱码问题,真是头疼啊! 后来终于在网上找到一点资料是关于FileZilla server中文乱码的问题,以前低版本是不会有这样的问题的 大意说是从0.9.14版之后用的字符集是UTF8,使用0.9.14及之前的版本是没有中文乱码问题的(经测试过确实是没有中文乱码问题) 幸好有filezlliaPV这个补丁(http://sourc

安装python科学计算库 [windows下]

由于今天数据挖掘练习的缘故,需要安装一些常用的科学计算库,如耳熟能详的numpy,scipy,sklearn,matplotlib,seaborn等. 本机python 32位版本3.6,使用pip3安装相关库,看到知乎上要说换用anaconda(附带python和一些扩展库),再用conda工具安装没有的库,可以很好的解决依赖问题.由于我对Python的依赖关系的管理没有深入了解,只依赖于pip或者easy_install的使用,所以当遇到pip安装某个库失败时,就有些无措了. 解决方法如下:

< python音频库:Windows下pydub安装配置、过程出现的问题及常用API >

< python音频库:Windows下pydub安装配置.过程出现的问题及常用API > 背景 刚从B站上看过倒放挑战之后也想体验下,心血来潮一个晚上完成了基本的实现.其中倒放与播放部分使用了pydub这个音频库,十分快捷方便,但是它完整一套的配置让我还是踩了几个坑.特将其配置过程记录于此,方便大家. Windows10系统 < Pydub in Github > 安装Pydub Anaconda:打开Anaconda prompt,activate切换至工作环境下,键入pip

解决Windows下安装MySQL 5.5,运行MySQLInstanceConfig.exe没有响应的方法

我在Windows Server 2003虚拟机上安装MySQL5.5(社区版).这个虚拟机之前被别人安装过MySQL5.5和MySQL5.0,但是忘了root密码,所以重装.不出意外的遇到了配置MySQL Instance时MySQLInstanceConfig.exe没有响应的问题.(我记得以前遇到这个问题,就果断换了MySQL5.0,绕开却并未解决) 试了很多方法,有说需要以Administrator身份运行(据说WIN7上安装会是这个问题,而我用的是Windows Server 2003

Windows下ActiveMQ下载、安装部署

Windows下ActiveMQ下载.安装部署 1.下载:http://activemq.apache.org/download.html 最新Windows版本 2.安装 (1) 首先配置JAVA环境变量 JAVA_HOME=D:\Program Files\Java\jdk1.5.0 CLASSPAHT=.;D:\Program Files\Java\jdk1.5.0\lib\tools.jar;D:\Program Files\Java\jdk1.5.0\lib\td.jar;D:\Pro

Windows下MySQL的my.ini文件字符集测试

环境:Windows 8.1+MySQL 5.6.19 首先要说明的是Windows下MySQL的my.ini所在位置为:盘符\ProgramData\MySQL\MySQL Server 5.6下,也就是下图的Data Path下,如果是系统盘,ProgramData的文件夹是隐藏的;非系统盘此文件不是隐藏的.并不是Program Files下的. 2,查看my.ini文件,默认安装的编码都是utf8的. default-character-set=utf8 character-set-ser

[django]windows下用Django,静态文件请求失败,出现UnicodeDecodeError

问题:windows下用Django,静态文件请求失败,出现UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 1:invalid start byte,怎么解决啊? 回答:应该是静态文件的格式问题.也许它的编码是GBK的,你用UTF-8解,就解不开.用记事本打开,另存一个UTF-8格式.

windows下Perl如何读取大文件的最后一行(总结)

Perl中读取文件最后一行的方法很多,比如 (1)将文件读入数组,取最后一个元素 open (FILE,"file.txt") or die "$!"; my @arr=<FILE>;; close FILE; my $last=$arr[$#arr]; #$last里就是最后一行的内容了. (2)一行一行读入,到最后一行时输出 open (FILE,"file.txt") or die "$!"; while (

完美解决 Linux 下 Sublime Text 中文输入

首先,我参考了好几篇文章,都是蛮不错的,先列出来: sublime-text-imfix:首先推荐这个方法,最简单,但是在我的系统上有些问题.可用这个的强烈推荐用这个 完美解决 Linux 下 Sublime Text 中文输入:讲的比较明白,也可用参考. Ubuntu下Sublime Text 3解决无法输入中文的方法: 讲解的最清楚了,建议看看. 测试系统:Ubuntu 14.04 (理论上所有 Linux 发行版都通用) 输入法:Fcitx 4.2.6.1 Sublime Text 版本: