背景:有mysql数据库,将数据从数据库中读取,并存储到xml中

采用了MySQLdb和lxml两个库

具体编码处理过程如下:

. 指定mysql的编码方式
.取数据库data->判断data类型(type, isinstance)->| unicode字符->|有特殊控制字符->去除
| |正常->直接写入
|
|数字,日期等格式->转为字符串
|其他编码方式字符->decode

1.指定mysql编码方式

按照如下方式指定字符集:来源

db = MySQLdb.connect(..., charset='utf8')

如果不指定字符集,当默认字符集与实际数据字符集不同时,取出的数据会出现乱码。

2.取出数据后判断数据类型

为何要判断数据类型呢?因为lxml中的数据都要是字符类型的,而数据库中取出的数据有可能是int, long, date之类非数字类型,所以需要判断以便于后续处理

判断方式有两种:type和isinstance

>>> n = 911
>>> type(n)
<type 'int'>
>>> type(n) is int
True
a = 111
isinstance(a, int)
True

isinstance要优于type:区别就是 对于subclass之类的 type就不行了 来源

class A:
pass class B(A):
pass isinstance(A(), A) # returns True
type(A()) == A # returns True
isinstance(B(), A) # returns True
type(B()) == A # returns False

注意判断时类型就直接写 int, str, unicode就可以,不要引号

3.去除unicode中的特殊字符

来源

unicode中只支持以下字符

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

所以,需要把除上述范围之外的特殊字符都删掉,否则会报错

采用正则

content = re.sub(u'[^\u0020-\uD7FF\u0009\u000A\u000D\uE000-\uFFFD\u10000-\u10FFFF]+', '', text)

在来源中还有其他的方案,但是正则的速度快

4. 数字等类型转为字符串

直接str(),因为lxml支持ascii和unicode,所以用str直接转为ascii编码就可以

5. 其他编码方式decode

其实前面mysql中指定了编码方式后不应该有其他编码类型的,不过这里也介绍一下处理方法->decode

用decode将字符串解码为标准unicode

'abc'.decode('utf-8')

decode使用时需要给出字符的原本编码方式,如果不确定的话可以用chardet来判断

import chardet

s = "abc"
code_method = chardet.detect(s)
print code_method

输出:

{'confidence': 1.0, 'encoding': 'ascii'}

最新文章

  1. 充电时间 Go中的数组、切片、map简单示例
  2. preparestatement可以避免注入
  3. 新版Microsoft Azure Web管理控制台 - Microsoft Azure New Portal - (1)
  4. php 字符串处理
  5. 7款HTML5的精美应用教程让你立即爱上HTML5
  6. [ An Ac a Day ^_^ ] hdu 5835 Danganronpa 令人发指
  7. 教你3分钟读懂HTML5语言的特点
  8. BZOJ_2124_等差子序列_线段树+Hash
  9. 生活英语读写MOOC-Literature Tutor-有声名著阅读推荐
  10. java 中的interface是否继承object
  11. java33
  12. Java笔记(十五) 并发包
  13. 【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源
  14. 复选框批量删除操作-jquery方式
  15. 整理mianshi
  16. Swift简单实现一个常规条款、免责声明文字+带有链接的展示形式
  17. WIKI常用的表格设计模板
  18. 在IE、fixfox、chrome等浏览器中ajax提交成功后,打开新标签页面被浏览器拦截问题[转]
  19. 状态开关(ToggleButton)
  20. oracle之 等待事件LOG FILE SYNC (awr)优化

热门文章

  1. LYDSY模拟赛day3 平均数
  2. js 日期处理,json处理
  3. 我们为之奋斗过的C#-----C#的一个简单理解
  4. setImageResource和setBackgroundResource的區別
  5. BZOJ1861——book
  6. Xcode 6制作动态及静态Framework和各种坑
  7. (转载)XML解析之-XStream解析
  8. ubuntu 出现g++ : Depends: g++-4.8 (&gt;= 4.8.2-5~) but it is not going to be installed
  9. ubuntu14.04显卡驱动问题(amd5600k集显7650d)
  10. 10个php笔试题