最近在使用django的過程中,發現之前對中文編碼的理解並不怎麼正確,在此記錄一下。
1.在所有需要顯式使用中文的地方加上#-*- coding: utf-8 -*-標識,(包括注釋中的中文和**中字串的中文)
2.django在db中儲存的資料是經過encode的,但是通過模型取出的資料,是經過decode的。
3.python中在進行字串連線的時候,必須保證所有的子字串編碼或者未編碼一致
ok,先從最簡單的賦值開始。如下**:
#!/usr/bin/python
#-*- coding: utf-8 -*-
import logging
logging.basicconfig(level=logging.debug,
format=
'%(asctime)s %(levelname)s %(message)s',
filename=
'log.txt',
filemode=
'a+')
x ='我愛你'
logging.info(x)
print x
輸出是:
我愛你
log.txt中的結果是:
2010-06
-2517:
50:51,019 info 我愛你
x是未經過decode的,所以在print的時候,系統會自動根據編碼格式判斷來輸出中文。
這裡其實也引申出乙個原則,當你進行print,寫入檔案,呼叫系統命令(命令的引數需要中文)等系統相關的操作的時候,將字串encode;當從檔案中把內容取出來的時候,馬上decode。也就是說,在程式邏輯中,操作的字串都應該是decode過的。
ok,我們做第二個實驗
#!/usr/bin/python
#-*- coding: utf-8 -*-
import logging
logging.basicconfig(level=logging.debug,
format=
'%(asctime)s %(levelname)s %(message)s',
filename=
'log.txt',
filemode=
'a+')
x ='我愛你'
logging.info(x.decode('utf-8'))
print x.decode('utf-8')
此時print呼叫會報錯:
1.py|
11| unicodeencodeerror:
'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
而log呼叫仍然成功:
2010-06
-2517:
55:05,868 info 我愛你
print的結果是在意料之中的,但是log的結果卻是令人驚訝,猜測是log類在寫入檔案之前判斷了內容的編碼/解碼,然後進行了encode之後寫入。
下面是第三個,即如果組成字串的子字串編碼/解碼不一樣,會怎樣:
#!/usr/bin/python
#-*- coding: utf-8 -*-
import logging
logging.basicconfig(level=logging.debug,
format=
'%(asctime)s %(levelname)s %(message)s',
filename=
'log.txt',
filemode=
'a+')
x ='我愛你'
y ='真的'
cmd =
"1 %s %s"
% (x,y)
print cmd
cmd =
"2 %s %s"
% (x.decode('utf-8'),y.decode('utf-8'))
print cmd.encode('utf-8')
cmd =
"3 %s %s"
% (x,y.decode('utf-8'))
print cmd
輸出如下:
||1 我愛你 真的
||2 我愛你 真的
|| traceback (most recent call last):
1.py|
17| unicodedecodeerror:
'ascii' codec can't decode byte 0xe6 in position 2: ordinal not in range(128)
其實第三個實驗就是我在django的使用中遇到的問題,從django中用mvc模型取出的資料是經過了decode之後的,但是其他的本地變數資料卻是沒有經過任何decode的,導致一直報錯。
python Django的簡單應用
建立django工程 django admin.py startproject yourprojectname 關係 工程下有多個應用。django的工作模式mtv模式 m 模型 model 負責業務物件和資料庫的關係對映 orm t 模板 template 負責如何把頁面展示給使用者 html v...
python Django安裝教程
2.解壓到桌面 3 開啟cmd cd到這個目錄執行 python setup.py install命令即可安裝,安裝成功提示 installed d python27 lib site packages pytz 2018.5 py2.7.egg finished processing depend...
Python Django傳送郵件
經常我們登陸一些 或者軟體都會出現簡訊驗證或者郵箱驗證,今天來初步了解一下郵箱驗證的實現。路由配置等這裡不再介紹,具體的郵箱設定請參考我以前的部落格 設定郵箱以及獲得授權碼 引入傳送郵件的模組 from django.core.mail import send mail,send mass mail...