【中文编码】使用Python处理中文时的文字编码问题
2016-02-29 14:40
671 查看
0x00 正文
最近,在处理中文编码的数据的时候,遇到了一些还是令人头疼的问题。乱码!
乱码!!
乱码!!!
稍微整理一下处理过程,顺带着记录一下解决方案啥的……
0x01 文本转码
最初,拿到很多GB2312(Simplify)编码的HTML文件,稍微有点头疼,因为在Shell里打开一看,都是下面这样奇怪的东西
<p><span style="font-family: ; font-size: 14px;"> </span><span style="font-fami˨λ[H pan></p> <p><span style="font-family: ; font-size: 14px;"> 6 ҩӦ[H θƤĤ</span></p> <p><span style="font-family: ; font-size: 14px;"> 7 ˨ʹ �pan></p
然后就encode/decode忙了半天都看不出来这到底是个啥……
于是就想方设法……把它们都变成UTF-8试试看
关键句: (需要
import commands)
iconv -f gb18030 -t utf-8 FileA.html > FileB.html
将
FileA.html由
gb18030转换到
UTF-8,输出至文件
FileB.html
完整转换代码如下:
# -*- coding: gbk -*- from bs4 import BeautifulSoup from multiprocessing import Pool import os import re import sys import urllib2 import commands import ConfigParser def CheckTitle(soup) : pos = 0 for p in soup.find_all('p'): if pos == 1 : curp = p return curp.get_text().encode('utf-8') else : pos = pos + 1 def GetFileList() : FileList = [] for root,dirs,files in os.walk("./html/"): for filename in files: FileList.append(filename) # print filename return FileList if __name__ == '__main__' : FileList = GetFileList() for each in FileList: infile = "./html/" + each outfile = "./html-UTF/" + each command = 'iconv -f gb18030 -t utf-8 ' + str(infile) + ' > ' + str(outfile) # print command (status, output) = commands.getstatusoutput(command) l.Notice("Status: %s\nOutput: %s" % (str(status), str(output)))
代码解释:遍历当前目录下的
html文件夹,将其中所有的文件转换编码之后输出至
html-UTF文件夹中,命名为与原先同名的文件
0x02 中文字符的split用法
获得了中文字符串之后,想要用split函数将其按逗号分号和句号等分割成小短句方便处理,然而,将中文字符中的逗号分号句号等为split函数传参的时候,会出现问题,一万个报错,大概意思都是编码问题:不能出现在position多少到多少之间blablabla……那么,该怎么办呢
像我这样转成了UTF-8的html中提取的中文字符串,python文件头上如果加上
#-*- coding: UTF-8 -*-,python在判断传参的中文字符的时候就可以编码正确了,顺手再写一个多字符匹配分割的demo备忘:
#-*- coding: UTF-8 -*- import os import re import sys import commands import ConfigParser def my_split(s, seps): res = [s] for sep in seps: s, res = res, [] for seq in s: res += seq.split(sep) return res if __name__ == '__main__' : inputText = "今天天气不错。啥?下雨了!12345" txt = inputText.strip() mylist = my_split(txt,['\n','\r','\t',',',';',',','。',';'])
0x03 正确获得中文字符串的len()
通常,我们需要知道某个中文字符串的长度,然而我们查看的时候,由于编码的问题,往往长度会变为需求值的整数倍(倍数与编码类型有关,刚刚在Python中测试了len(str)是中文字数的3倍,这个很有趣,到时候可以去查一查具体何种编码占多少个字符位置),如下为C++中的测试那么在Python中我们该如何获得正确的中文字符个数呢?
我们可以decode一下,将字符串变为当前python所用的编码方式,示例如下:
# s1,s2 请自主获取,本人是读的`UTF-8`编码文件中的字符串 str1,str2 = s1.decode('utf-8'),s2.decode('utf-8') print len(s1,s2) print len(str1,str2) print s1,s2,'\n',str1,str2
0x04 Shell中的乱码现象
“我编码都是对的,直接打开也正常,为什么在Shell里看的就都是乱码呢?”
嘛,你可以试试更改一下会话选项中的字符编码哦,可能只是你的Shell会话的编码设置得不对应罢了~
0x05 等以后遇到新的问题再接着写吧~
编码真是博大精深,Python要是没有编码问题这个世界该多美好呀QwQ相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法