在Django視圖函數(shù)中經(jīng)常出現(xiàn)類似于'ascii' codec can't decode byte 0xef in position 0:ordinal not in range(128)的錯(cuò)誤。
? ? ? ? 在解決錯(cuò)誤之前,首先要了解unicode和utf-8的區(qū)別。
??????? unicode指的是萬國(guó)碼,是一種“字碼表”。而utf-8是這種字碼表儲(chǔ)存的編碼方法。unicode不一定要由utf-8這種方式編成bytecode儲(chǔ)存,也可以使用utf-16,utf-7等其他方式。目前大多都以u(píng)tf-8的方式來變成bytecode。
其次,Python中字符串類型分為byte string 和 unicode string兩種。
如果在python文件中指定編碼方式為utf-8(#coding=utf-8),那么所有帶中文的字符串都會(huì)被認(rèn)為是utf-8編碼的byte string(例如:mystr="你好"),但是在函數(shù)中所產(chǎn)生的字符串則被認(rèn)為是unicode string。
問題就出在這邊,unicode string 和 byte string 是不可以混合使用的,一旦混合使用了,就會(huì)產(chǎn)生這樣的錯(cuò)誤。
簡(jiǎn)單的做法就是把字符串轉(zhuǎn)為utf-8: u"xxxxxx"