python mysql utf-8 latin

最近在作這個新聞爬蟲進行文本分析,從網上down了一些爬蟲的代碼 代碼源用的是html

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%9Apython

能夠直接使用 python 2.7+mysql5.6+window7系統+pycharm(IDE)mysql

由於爬蟲涉及到中文存儲到mysql數據庫,因此中間經歷了中文亂碼顯示,中文存儲到數據庫不能正常顯示,從python端打印出來的字符也不是中文顯示的問題git

歸根揭底這都是編碼格式的問題。因此寫下來做爲筆記咯,在數據圈混的人,哪能繞開編碼格式呢....程序員

先說python端編碼問題:github

Python2(包括Python2六、Python27等)的字符串一般包含str、unicode兩種類型,一般str的字符串編碼方式由源碼文件的編碼方式決定,目前使用的基本都是UTF-8的編碼格式,因此要在py文件的頭部指定編碼格式:# -*- coding: utf-8 -*-sql

在Python程序內部,一般使用的字符串爲unicode編碼,這樣的字符串字符是一種內存編碼格式,若是將這些數據存儲到文件或是記錄日誌的時候,就須要將unicode編碼的字符串轉換爲特定字符集的存儲編碼格式。數據庫

那什麼是UNICODE、UTF-8呢?Unicode和UTF-8有什麼聯繫呢?json

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類型的變量的編碼方式和終端設置的編碼方式不一致,極可能會出現亂碼問題。

ex三、列表或字典中的中文處理

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")以後的存儲就直接是正常的文字了

相關文章
相關標籤/搜索