背景:有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'}

【python】mysqlDB转xml中的编码问题的更多相关文章

  1. web.xml 中以编码方式添加filter并设置初始化参数AbstractAnnotationConfigDispatchServletInitializer

    web.xml中配置filter <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...

  2. Python 2 中的编码

    在 Python 尤其是 Python2 中,编码问题是困扰开发者尤其初学者的一大问题.什么 Unicode/UTF-8/str ,又是 decode/encode 的,搞得人头都大了.其实不然,这有 ...

  3. jboss:在standalone.xml中设置系统属性(system-properties)

    就象在.net的web应用中,可以在web.config中设置appSettings一样,jboss的standalone.xml中也可以由开发人员自行添加系统属性,用法如下: </extens ...

  4. python中的编码问题:以ascii和unicode为主线

      1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8 ...

  5. 【转】【Python】 python中的编码问题报错 'ascii' codec can't decode 及 URL地址获取中文

    1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8是u ...

  6. python的str,unicode对象的encode和decode方法, Python中字符编码的总结和对比bytes和str

    python_2.x_unicode_to_str.py a = u"中文字符"; a.encode("GBK"); #打印: '\xd6\xd0\xce\xc ...

  7. python语言中的编码问题

    在编程的过程当中,常常会遇到莫名其妙的乱码问题.很多人选择出了问题直接在网上找答案,把别人的例子照搬过来,这是快速解决问题的一个好办法.然而,作为一个严谨求实的开发者,如果不从源头上彻底理解乱码产生的 ...

  8. 聊聊python 2中的编码

    为什么需要编码: 计算机可以存储和处理二进制,那么从文字到计算机可以识别的二进制之间需要对应的关系,于是便有了ASCII,ASSCII使用7位字符,由于1byte=8bit,所以最高位补一个0,使用8 ...

  9. python unicode 转中文 遇到的问题 爬去网页中遇到编码的问题

    How do convert unicode escape sequences to unicode characters in a python string 爬去网页中遇到编码的问题 Python ...

随机推荐

  1. [译]bare repository

    git init --bare 使用--bare创建的repository没有工作目录, 在这个repository中不能修改文件和commit. 中心repository必须是bare reposi ...

  2. 基础知识系列☞C#中→属性和字段的区别

    "好吧...准备写个'基础知识系列',算是记录下吧,时时看看,更加加深记忆···" 其实本来准备叫"面试系列"... 字段.属性.你先知道的哪个概念? ***我 ...

  3. (1)apply族函数总论

                  来自为知笔记(Wiz) 附件列表

  4. ACM数论之旅7---欧拉函数的证明及代码实现(我会证明都是骗人的╮( ̄▽ ̄)╭)

    欧拉函数,用φ(n)表示 欧拉函数是求小于等于n的数中与n互质的数的数目 辣么,怎么求哩?~(-o ̄▽ ̄)-o 可以先在1到n-1中找到与n不互质的数,然后把他们减掉 比如φ(12) 把12质因数分解 ...

  5. Spring的问题解决记录

    问题:在MyEclipse中项目工程重命名以后,例如 原来叫HttpService,改为GameApp,但是项目跑起来发现,tomcat服务器依旧为GameApp目录结构,访问也只能GameApp访问 ...

  6. php运行出现Call to undefined function curl_init()的解决方法

    解决方法如下: 1.在php.ini中找到extension=php_curl.dll,去掉前面的分号;,然后将php.ini拷贝到c:\windows. 2.重启IIS服务,或回收应用程序池即可.

  7. YC大牛的判题任务-想法

    YC大牛的判题任务 Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class ...

  8. MS Project 使用之创建项目信息

    1. 我们打开MS Project 2013,创建一个空白文档. 2. 切换“项目”选项卡,点击“项目信息”,设置项目开始时间等信息,项目一般是需要设置开始时间和使用日历的,下面我们分别进行设置 如, ...

  9. Sqli-LABS通关笔录-11[sql注入之万能密码以及登录框报错注入]

    在这一关卡我学到了 1.万能密码的构造,大概的去揣测正常的SQL语句是如何的. 2. 3. 00x1 SQL万能密码的构造 在登录框当中可以添加了一个单引号.报错信息如下所示: 据此报错,我们大概的可 ...

  10. 一起入门python7之函数参数

    上一节课简单的讲了一下函数.那么今天来给大家讲一下函数参数.用案例说话哈.上一节课只是让大家有比较简单的了解,那么这节我们来细化一下哈.>>>def hello(x):        ...