国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python中文亂碼不著急,先看懂字節(jié)和字符

2020-02-16 11:13:32
字體:
供稿:網(wǎng)友

Python2.x使用過程中,中文亂碼解決最耳熟能詳?shù)姆椒ň褪窃诖a前加上#-*- coding:utf-8 –*-

那么為什么需要這么做呢?什么又是字節(jié)和字符?下面我們了解下。

我來講一下字符問題我的理解吧,雖然我對Python的編碼處理的具體細(xì)節(jié)還不太清楚,不過臨時稍微看了一下,和Perl的原理也差不多

最重要的是必須區(qū)分“字符”和“字節(jié)”的不同,“字符”是抽象的,而“字節(jié)”是具體的

比如一個“中”字,在不同編碼中用如下字節(jié)表示:

    GBK      Big5        UTF-8     UTF-16LE 
/xD6/xD0  /xA4/xA4  /xE4/xB8/xAD  /x2D/x4E 

所謂“抽象”的“字符”的“中”,并不是指“/xD6/xD0”或“/xA4/xA4”或任何字節(jié),應(yīng)該把它理解成:GBK編碼中“/xD6/xD0”字節(jié)所指代的那個字符(語言學(xué)中的能指→所指),或者UTF-8編碼中“/xE4/xB8/xAD”所指代的那個字符,但并不是這些具體字節(jié)本身

問題是,抽象的字符要作為數(shù)據(jù)進(jìn)行存儲和傳遞,就必須有具體的形式,也就是說你在程序內(nèi)部實現(xiàn)中,要存儲“中”這個字符,你必須采用某些特定的字節(jié)。你可以用“/xD6/xD0”,也可以用“/xE4/xB8/xAD”,也可以用“/x2D/x4E”,Python在Windows下采用的是UTF-16LE(?),也就意味著它的“字符”的載體編碼是UTF-16LE

sys.setdefaultencoding(name) Set the current default string encoding used by the Unicode implementation. 

文檔上是這么寫的,如果我的理解沒錯的話,這個函數(shù)的作用就是改變“字符”的載體編碼,sys.setdefaultencoding('gbk')以后,“中”這個字符在程序內(nèi)部就不是用“/x2D/x4E”來承載,而是用“/xD6/xD0”來承載了

Python2.x里的str和unicode有什么區(qū)別呢?從字面意義上看容易混淆,實際上,你可以把它理解成str是“字節(jié)串”,unicode是“字符串”(string總是翻譯成“字符串”,在這里就很容易把人繞暈),看下面的例子:

# -*- coding: gb2312 -*-  s = "張三李四" print len(s) #=> 8 u = s.decode('gbk') print len(u) #=> 4 

我的腳本編碼用的是GBK,而不是UTF-8,你會看到len(s)是8,這是這四個漢字所用的實際8個“字節(jié)”,而len(u)是4,這就表示這里有4個“字符”

encode和decode是什么意思呢?所謂編碼,就是把意義轉(zhuǎn)換成符號;而解碼,就是把符號還原成意義。在這里,encode應(yīng)該理解成把抽象的字符轉(zhuǎn)換成具體的字節(jié),而decode是把具體的字節(jié)還原成抽象的字符

現(xiàn)在的問題是:str類和unicode類都同時具有encode和decode方法,這是一個讓我很不以為然的設(shè)定。如果按照字節(jié)與字符的區(qū)分,encode方法是應(yīng)該只歸unicode類所有,decode方法是只歸str類所有的,因為“意義”只能轉(zhuǎn)換成“符號”,“意義”再還原成“意義”這本身就沒有意義。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广安市| 昌黎县| 嵩明县| 隆德县| 南部县| 新民市| 克拉玛依市| 哈尔滨市| 顺昌县| 明光市| 赣州市| 汾阳市| 雷波县| 依兰县| 循化| 富顺县| 沧州市| 东乌| 桃江县| 如皋市| 进贤县| 南丰县| 五原县| 隆尧县| 花莲市| 民县| 海丰县| 宁海县| 榆树市| 铜陵市| 汉沽区| 黔江区| 四会市| 临高县| 中牟县| 日照市| 临泉县| 莱西市| 石景山区| 龙门县| 杂多县|