Python中文处理的一些心得

前言

Python中处理中文以及字符串处理总是一知半解,最近正好在项目中碰到了一些问题,处理的主要是url中带了中文的情况,留下一些心得体会,供后来者参考。注:目前使用的是Python2.7,Python3.x可能不一定适用。

正文

先来介绍一些背景知识
要了解中文以及字符串处理的这些,首先需要了解一些中文编码的基本概念,这些概念我不在这里细讲了,请读者自己google。

  • Unicode
  • UTF-8
  • GB2312/GBK/GB18030

另外,还要了解一下Python里面字符串的表示方法,字符转换主要就是在以下两者间进行:

  • str, 这个基本和C语言中的char数组类似
  • unicode, 这个概念需要和Unicode字符集要分开,这个是Python中存储Unicode类型字符串的结构

简单的说,这两者的联系就是str是由unicode经过编码(encode)后的字节组成的:

  • str.decode(‘codec name’) -> unicode
  • unicode.encode(‘codec name’) -> str

这两者之间的关系就是QString和QByteArray,只是在Python里面比较灵活,貌似str也可以去encode,unicode也可以decode,但是大概率会报错。

好了,现在把遇到的问题的代码和解决方案写一下,实现的功能是一个http代理服务,把ftp或者内网访问的url通过代理转换成http协议,参数url经过了URLEncode传入,现场运行后,发现大部分url都正常,但url中直接带中文的情况下,就会访问不到,而且print这句话就会抛”UnicodeEncodeError”异常:

  1. def proxy(self, url):
  2. url_dec = urllib.unquote_plus(url)
  3. print 'decoded url:', url_dec

调试了一下,通过PyCharm看到,url是一个unicode,经过urllib.unquote_plus调用之后,url_dec也是一个unicode,但是原先utf-8编码的中文部分没有被正确decode成unicode。解决方案也比较简单,上代码:

  1. url_dec = urllib.unquote_plus(url.encode('utf8')).decode('utf8')

先将url参数encode为str,再通过urllib.unquote_plus调用,这个调用参数如果是str那么返回的参数也是str,此时再将str decode为unicode即可!

体会

  • PyCharm工具真不错,没有这个工具调试,这个问题解决得肯定没有这么顺利

Python中文处理的一些心得》上有1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注