python django的中文編碼總結

2021-06-17 17:56:55 字數 2440 閱讀 4087

最近在使用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...