系統編碼,能夠經過locale命令查看(LINUX)https://wiki.archlinux.org/index.php/Locale_(簡體中文), centos7 配置文件在/etc/profile.d/lang.sh
文件編碼,它表明源碼文件內的全部內容都是根據詞方式編碼成二進制碼流,存入到磁盤中的。
python編碼,是指python內設置的解碼方式。若是不設定的話,python2默認是ascii解碼。在源碼文件開頭(必定是第一行):#-*-coding:UTF-8-*-,源碼文件的設置解碼方式是UTF-8
unicode是python中的字符集,utf-8是unicode的一種實現,因此python2中有string和unicode兩種字符串,string就是按照python編碼的,unicode是字符集,有人稱unicode爲內碼。http://blog.sina.com.cn/s/blog_67852f560101fjtc.html
Python內部的字符串通常都是 Unicode編碼。代碼中字符串的默認編碼與代碼文件自己的編碼是一致的。因此要作一些編碼轉換一般是要以Unicode做爲中間編碼進行轉換的,即先將其餘編碼的字符串解碼(decode)成 Unicode,再從 Unicode編碼(encode)成另外一種編碼。
decode 的做用是將其餘編碼的字符串轉換成 Unicode 編碼,eg name.decode(「GB2312」),表示將GB2312編碼的字符串name轉換成Unicode編碼
encode 的做用是將Unicode編碼轉換成其餘編碼的字符串,eg name.encode(」GB2312「),表示將GB2312編碼的字符串name轉換成GB2312編碼php
因此在用python讀寫文件的時候,要注意文件編碼是哪一種,本身python解釋器用哪一種編碼方式。html
系統編碼:locale:gbk
python源文件test.py
#coding='UTF-8'
s='文斌'
print s
在test.py保存的時候,會按照系統編碼方式GBK的方式(有的編輯器也能自定義編碼格式),編碼成gbk二進制碼流,存儲到磁盤上。當運行該程序時。gbk二進制碼流調入內存,並按照python設置的解碼方式解碼,也就是按照UTF-8的方式解碼,因此結果不是錯誤提示,就是顯示出來的是亂碼。python
再好比最常看到的:linux
test1.pyvim
s = '文斌'
print s.decode()centos
沒有指定python編碼方式,默認確定爲ascii,因此就沒辦法編碼文字 '文斌' 了,因此運行這個腳本確定報錯,當你用 # -*- coding: utf-8 -*- 頭文件後就指定了python解析器的編碼方式,就不會報錯了。
===================================================================================編輯器
下面是一下大神的總結
編碼:
http://www.crifan.com/files/doc/docbook/char_encoding/release/html/char_encoding.html
計算機中存放的都是0和1的二進制值。8個位對應一個字節,經常使用16進制來表示,注意是表示,由於是2^4,因此0xF就表示這個字節,0x是16進制的意思,0xF就表示了這個字節裏是11111111
ASCII的編碼規則,因爲最初只是爲英文字母所考慮的,而英文只有26個字母,以及加上其餘大小寫字母,常見的字符,常見數字等,全部的加起來,也就幾十個,而一個字節8位中前7位的理論上能夠表示27=128個字符,因此對於設計出來的編碼規則來講,只須要用一個字節來表示,就足夠了。
Unicode只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。
若是Unicode統一規定,每一個符號用三個或四個字節表示,那麼每一個英文字母前都必然有二到三個字節是0,這對於存儲來講是極大的浪費,文本文件的大小會所以大出二三倍,這是沒法接受的。
UTF-8是Unicode的實現方式之一。
UTF-8最大的一個特色,就是它是一種變長的編碼方式。它可使用1~4個字節表示一個符號,根據不一樣的符號而變化字節長度。
Unicode符號範圍(十六進制) UTF-8編碼方式(二進制)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
python 頭文件:
http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/
1
# -*- coding: utf-8 -*-
對此格式的詳細解釋是:
1 若是沒有此文件編碼類型的聲明,則python默認以ASCII編碼去處理,若是你沒聲明編碼,可是文件中又包含非ASCII編碼的字符的話,python解析器去解析的python文件,天然就會報錯了。
2 必須放在python文件的第一行或第二行
3 更加精確的解釋是: "coding[:=]\s*([-\w.]+)"
4 爲了照顧特殊的Windows中的帶BOM(’\xef\xbb\xbf’)的UTF-8:
若是你的python文件自己編碼是帶BOM的UTF-8,即文件前三個字節是:’\xef\xbb\xbf’,那麼:
i 即便你沒有聲明文件編碼,也自動當作是UTF-8的編碼
ii 若是你聲明瞭文件編碼,則必須是聲明瞭(和你文件編碼自己相一致的)UTF-8
不然(因爲聲明的編碼和實際編碼不一致,天然)會報錯
python編碼
http://blog.chinaunix.net/uid-27838438-id-4227131.html
Python內部的字符串通常都是 Unicode編碼。代碼中字符串的默認編碼與代碼文件自己的編碼是一致的。因此要作一些編碼轉換一般是要以Unicode做爲中間編碼進行轉換的,即先將其餘編碼的字符串解碼(decode)成 Unicode,再從 Unicode編碼(encode)成另外一種編碼。
decode 的做用是將其餘編碼的字符串轉換成 Unicode 編碼,eg name.decode(「GB2312」),表示將GB2312編碼的字符串name轉換成Unicode編碼
encode 的做用是將Unicode編碼轉換成其餘編碼的字符串,eg name.encode(」GB2312「),表示將GB2312編碼的字符串name轉換成GB2312編碼
因此在進行編碼轉換的時候必須先知道 name 是那種編碼,而後 decode 成 Unicode 編碼,最後載 encode 成須要編碼的編碼。固然了,若是 name 已經就是 Unicode 編碼了,那麼就不須要進行 decode 進行解碼轉換了,直接用 encode 就能夠編碼成你所須要的編碼。
例子:讀取一個文件編碼格式爲gbk的文件,而後輸出一個utf8格式的文件
# coding: UTF-8
fp1 = open('test.txt', 'r')
info1 = fp1.read()
# 已知是 GBK 編碼,解碼成 Unicode
tmp = info1.decode('GBK')
fp2 = open('test.txt', 'w')
# 編碼成 UTF-8 編碼的 str
info2 = tmp.encode('UTF-8')
fp2.write(info2)
fp2.close()
設置python編碼方法:注意要先reload
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
print sys.getdefaultencoding()
unicode是一個內置函數,第二個參數指示源字符串的編碼格式。
s1 = u'中文'
s2 = unicode('中文','gbk')
s3 = s1.decode('gbk')
在vim中查看文件編碼格式
:set fileencoding
函數