python mysql utf-8 latin

news/2024/7/19 9:51:02 标签: python, 爬虫, json

最近在做这个新闻爬虫进行文本分析,从网上down了一些爬虫的代码 代码源用的是

https://jooop.github.io/2017/01/29/python3%E7%BD%91%E6%98%93%E7%88%AC%E8%99%AB/#1-%E6%A8%A1%E5%9D%97%E7%9A%84%E9%80%89%E6%8B%A9%E5%92%8C%E5%88%97%E8%A1%A8%E9%A1%B5%E9%9D%A2%E7%9A%84%E7%88%AC%E5%8F%96%EF%BC%9A

可以直接使用 python 2.7+mysql5.6+window7系统+pycharm(IDE)

因为爬虫涉及到中文存储到mysql数据库,所以中间经历了中文乱码显示,中文存储到数据库不能正常显示,从python端打印出来的字符也不是中文显示的问题

归根揭底这都是编码格式的问题。所以写下来作为笔记咯,在数据圈混的人,哪能绕开编码格式呢....

先说python端编码问题:

Python2(包括Python26、Python27等)的字符串通常包含str、unicode两种类型,通常str的字符串编码方式由源码文件的编码方式决定,目前使用的基本都是UTF-8的编码格式,所以要在py文件的头部指定编码格式:# -*- coding: utf-8 -*-

在Python程序内部,通常使用的字符串为unicode编码,这样的字符串字符是一种内存编码格式,如果将这些数据存储到文件或是记录日志的时候,就需要将unicode编码的字符串转换为特定字符集的存储编码格式。

那什么是UNICODE、UTF-8呢?Unicode和UTF-8有什么联系呢?

Unicode( 统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的 二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码,又称万国码。

简单来说,Unicode是一种概念,而UTF-8则是将unicode概念实例化。(老板说,我们要搞大数据架构(此时这个就是概念老板并不知道实现标准是啥对应unicode),程序员搞了个hadoop架构(UTF-8)就是大数据架构的实现)

以下是在python中实验的code

ex1:

In[10]: "中文"
Out[10]:
'\xe4\xb8\xad\xe6\x96\x87'

这个例子直接输入中文打印出来的utf-8编码格式的值

  • \x:只是 16 进制的意思,后边跟两位,则表示单字节编码;
    • \d:十进制;\o:八进制

ex2: 如果你想打印出来中文 必须在前面加print我不禁有些疑惑,why?  我的理解是如果不加print,python不认为你要求打印显示,只是显示一下数据,它就采用比较懒的方式直接显示这个字在计算机中的编码,如果你加了print,他就理解是你要求打印出来,打印出来就根据你这个实际代表的意思打印咯。前提是你的系统是UTF-8编码格式的哦。如果不是utf-8的编码格式,打印出来也是乱码。更改编码格式请见

In[11]: print "中文"

中文

In[12]: sys.getdefaultencoding()
Out[12]: 
'utf-8'

 

 

Answer:Print打印显示的过程

             

                                     图1. Print打印显示过程

  Python2.7中调用print打印var 变量时,操作系统会对var做一定的字符处理:如果var是str类型的变量,则直接将var变量交付给终端进行显示;如果var变量是unicode类型,则操作系统首先将var编码成str类型的对象(编码格式取决于stdout的编码格式),然后再交由终端进行显示。在终端显示时,如果str类型的变量的编码方式和终端设置的编码方式不一致,很可能会出现乱码问题。

ex3、列表或字典中的中文处理

data = {"a":"hello","b":"中国"}  #假设是utf-8的格式

这时我们用print直接输出data, 或用str函数将data转为字符串。其中的中文是变成unicode的字符,如:

>>> data = {"a":"hello","b":"中国"}
>>> print data
{'a': 'hello', 'b': '\xd6\xd0\xb9\xfa'}

单独输出中文字段没问题,如

>>> print data['b']
中国

如果希望能正常的将整个字典输出,可以利用json包的dump方法,如:

>>> data = {"a":"hello","b":"中国"}
>>> s = json.dumps(data,ensure_ascii=False);
>>> print s
{"a": "hello", "b": "中国"}

>>> print isinstance(s,str)
True

 

然后说一下这些数据如何正常的存储到mysql中去

首先mysql要支持utf-8编码存储,需要去mysql安装文件中my.ini配置中进行配置

[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
default-character-set=utf8

[mysqld]
port=3306
character-set-server=utf8
collation-server=utf8_general_ci

其次要确定你创建的表及字段默认存储也是utf-8的格式,具体查看和更改方式

https://www.cnblogs.com/wcwen1990/p/6917109.html 可以参考这个网页

然后你就需要将utf-8的字符直接按其本身的字符存储而不是用计算机默认进制字节存储,此时你可以通过

 str.decode("unicode_escape") 实现
下图是我没有进行decode转换,直接存储进去的就是unicode编码文件

 加了decode("unicode_escape")之后的存储就直接是正常的文字了

 

 
 

 

转载于:https://www.cnblogs.com/lxxlovekang/p/9151274.html


http://www.niftyadmin.cn/n/1853758.html

相关文章

使用Bugly收集并分析App的崩溃信息

找了一些关于bugly的博客,发现这篇比较全。 前言 先说下友盟的SDK,现在真是对友盟没脾气了,分享不正常!三方登录不正常!崩溃分析也不好用!最近所在项目的App,加了直播功能,总是会出…

deamo的网址

https://blog.csdn.net/jydave/article/details/50656455 广播(Broadcast)的简单用法 http://www.cgtsj.com/cg/f/vx3456/index.html OpenGL学习的视频 http://blog.sina.com.cn/s/blog_a23d30f101018gl4.html 浅学OpenGLES2.0 https://blog.cs…

解决使用loadNibNamed会报Could not load NIB in bundle的错误

问题描述:使用loadNibNamed会报 Could not load NIB in bundle 的错误解决办法:在xib的Unilities界面的 Show the File Inspector界面,也就是第一个按钮,找到Localization,点击Localize。注:如果有多个targ…

【php增删改查实例】第二十五节 - 在main.php中显示头像

在用户成功上传头像以后,用户登录系统,应该能够看到自己的头像,本节演示如何在这个地方: 添加用户头像。 1.用DIV做: border-radius:50% background:url(xxx.jpg) 2.用img标签做: border-radius:50% src 共…

雷达脉冲动画

最近无意间看到一个动画,感觉挺好,就回去找了一下,找了一组关于圆环的动画。下面是其中效果比较好的一个。同心圆脉冲动画。git: https://github.com/YST521/RadarAnimation.git

python-code-10

函数作业: 1、复习函数参数的使用 2、实现如下功能 编写用户注册函数,实现功能 1、在函数内接收用户输入的用户名、密码、余额 要求用户输入的用户名必须为字符串,并且保证用户输入的用户名不与其他用户重复 要求…

application loader 上传应用

之前的项目迭代中,在提交上传AppStore的时候用iTunes connect 上传ipa包的时候总是很慢,浪费了很多的时间,于是就换一种方式进行上传,就是application loader 。(相信你应该是利用iTunes connect上传过) 步骤:1.将自己…

重写Object.toString()总结

定义 toString()返回对象值的字符串,用于记录类的具体信息 Object.toString()返回值: classNamehashcode 每一个自己定义的类都尽量重写toString(),方便观察值与获得重要信息 Java默认调用toString() ""String 调用String.toString() System.…