系統編碼,文件編碼,python編碼




系統編碼,可以通過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編碼

 

所以在用python讀寫文件的時候,要注意文件編碼是哪種,自己python解釋器用哪種編碼方式。

系統編碼:locale:gbk
python源文件test.py
#coding='UTF-8'
s='文斌'
print s

在test.py保存的時候,會按照系統編碼方式GBK的方式(有的編輯器也能自定義編碼格式),編碼成gbk二進制碼流,存儲到磁盤上。當運行該程序時。gbk二進制碼流調入內存,並按照python設置的解碼方式解碼,也就是按照UTF-8的方式解碼,所以結果不是錯誤提示,就是顯示出來的是亂碼。

 

再比如最常看到的:

test1.py

s = '文斌'
print s.decode()

 

沒有指定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









免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM