當前位置:首頁 » 編程語言 » python3編碼

python3編碼

發布時間: 2022-01-11 18:13:30

A. python3如何把字元串轉換成系統默認編碼

python 3和2很大區別就是python本身改為默認用unicode編碼。
字元串不再區分"abc"和u"abc", 字元串"abc"默認就是unicode,不再代表本地編碼、
由於有這種內部編碼,像c#和java類似,再沒有必要在語言環境內做類似設置編碼,比如「sys.setdefaultencoding」;
也因此也python 3的代碼和包管理上打破了和2.x的兼容。2.x的擴展包要適應這種情況改寫。
另一個問題是語言環境內只有unicode怎麼輸出gbk之類的本地編碼。
答按慣例都在(序列化)輸出時才轉換成本地編碼。
比如

1

file.write("GBK的中文".encode("GBK"))

python環境內字元串用str.encode("GBK")方法輸出成位元組串用於和其他環境交流。

B. python3 decode()和encode()默認是什麼編碼格式

默認是utf-8
python3全面支持utf-8,再也不必為編碼煩惱了

C. python3.3中文亂碼與默認編碼格式設定。

我這邊輸出沒有什麼問題。

下面是輸出:
i = 1
s['statuses'][0]['text'] = 出軌是男人的天性,防小三是女人一生的戰役。
s['statuses'][1]['text'] = 漂亮女孩有時候比普通女孩更可憐。男人可以很坦然的拒絕普通女孩的感情和身體,但是男人會欺騙漂亮女孩的感情從而得到她的身體。這就是為什麼古人說紅顏命薄,你們感受一下。
s['statuses'][2]['text'] = 留幾手教你如何利用空閑時間學習
。。。
i = 2
s['statuses'][20]['text'] = 罵人,其實內容並不重要,一個小蘿莉,滿嘴臟話,也嚇不住人。
。。。
i = 3
s['statuses'][40]['text'] = 我不就是在你家住的時候吃了幾只燒雞沒給你錢么?至於這么編排我么?這情節都是你在哪本言情小說里扒出來的吧?
後面省略了。 前提就是這個樣子的

D. 為什麼python3字元串編碼不採用utf8

先問是不是,再問為什麼,py3的字元串編碼就是用的utf-8編碼。
python2 無需單獨聲明 utf8 編碼,但常要採用相應方法編碼或解碼
python3 無需單獨聲明 utf8 編碼,但偶爾也要採用相應方法編碼或解碼
python2 最大的一個 utf8 問題是在某些情況下,絕對不支持非 ASCII 字元文件路徑 (基本無解),你可網路查找 "CPython2.7 subprocess.Popen()不忍直視的Unicode中文路徑Bug 解決辦法"

E. 新手,求教關於python3編碼的問題

你需要明白兩個概念:

  1. 什麼叫字元串、位元組串

    在Python中字元串是指一串可以展示在終端里、供人閱讀的字元,至於字元採用什麼編碼並不重要,同樣的文字,可能是用Unicode、UTF-8或GBK編碼,但列印在終端中的內容相同,那麼就認為是同一串字元串。而位元組串是指將字元串通過某種編碼轉換得到的一串位元組,同樣一個字元串,使用不同的編碼轉換後得到的位元組串可能完全不同。

  2. 什麼叫encode、decode

    encode中文為編碼,顧名思義,是將字元串以某種編碼形式編碼得到位元組串的過程;相反,decode中文為解碼,是將位元組串以某種編碼形式翻譯得到字元串的過程。

a是一個字元串,它的內容是「周傑倫」這三個字,類型是str;b = a.encode('utf-8')是將a以utf-8形式編碼得到的位元組串,它的內容是「周傑倫」這三個字的utf-8編碼,類型是bytes

F. python3字元串都是什麼編碼

編碼

字元串是一種數據類型,但是,字元串比較特殊的是還有一個編碼問題。

因為計算機只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理。最早的計算機在設計時採用8個比特(bit)作為一個位元組(byte),所以,一個位元組能表示的最大的整數就是255(二進制11111111=十進制255),如果要表示更大的整數,就必須用更多的位元組。比如兩個位元組可以表示的最大整數是65535,4個位元組可以表示的最大整數是4294967295。

由於計算機是美國人發明的,因此,最早只有127個字母被編碼到計算機里,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母z的編碼是122。

Unicode

Unicode把所有語言都統一到一套編碼里,這樣就不會再有亂碼問題了。

Unicode標准也在不斷發展,但最常用的是用兩個位元組表示一個字元(如果要用到非常偏僻的字元,就需要4個位元組)。現代操作系統和大多數編程語言都直接支持Unicode。

現在,捋一捋ASCII編碼和Unicode編碼的區別:ASCII編碼是1個位元組,而Unicode編碼通常是2個位元組。

字母A用ASCII編碼是十進制的65,二進制的01000001;

字元0用ASCII編碼是十進制的48,二進制的00110000,注意字元'0'和整數0是不同的;

漢字已經超出了ASCII編碼的范圍,用Unicode編碼是十進制的20013,二進制的01001110 00101101。

如果把ASCII編碼的A用Unicode編碼,只需要在前面補0就可以,因此,A的Unicode編碼是00000000 01000001。

新的問題又出現了:如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不劃算。

所以,又出現了把Unicode編碼轉化為「可變長編碼」的UTF-8編碼。UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間:

字元

ASCII

Unicode

UTF-8

A 01000001 00000000 01000001 01000001

中 x 01001110 00101101 11100100 10111000 10101101

從上面的表格還可以發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分,所以,大量只支持ASCII編碼的歷史遺留軟體可以在UTF-8編碼下繼續工作。

搞清楚了ASCII、Unicode和UTF-8的關系,我們就可以總結一下現在計算機系統通用的字元編碼工作方式:

在計算機內存中,統一使用Unicode編碼,當需要保存到硬碟或者需要傳輸的時候,就轉換為UTF-8編碼。

用記事本編輯的時候,從文件讀取的UTF-8字元被轉換為Unicode字元到內存里,編輯完成後,保存的時候再把Unicode轉換為UTF-8保存到文件:

瀏覽網頁的時候,伺服器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器:

所以你看到很多網頁的源碼上會有類似<meta charset="UTF-8" />的信息,表示該網頁正是用的UTF-8編碼。

Python的字元串

在最新的Python 3版本中,字元串是以Unicode編碼的,也就是說,Python的字元串支持多語言,例如:

>>> print('包含中文的str')
包含中文的str

對於單個字元的編碼,Python提供了ord()函數獲取字元的整數表示,chr()函數把編碼轉換為對應的字元:

1個中文字元經過UTF-8編碼後通常會佔用3個位元組,而1個英文字元只佔用1個位元組。

在操作字元串時,我們經常遇到str和bytes的互相轉換。為了避免亂碼問題,應當始終堅持使用UTF-8編碼對str和bytes進行轉換。

Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存為UTF-8編碼。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行

#!/usr/bin/env python3# -*- coding: utf-8 -*-

第二行注釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。

格式化:

在Python中,採用的格式化方式和C語言是一致的,用%實現,舉例如下:

format % (...params)
>>> 'Hello, %s' % 'world''Hello, world'>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)'Hi, Michael, you have $1000000.'

%運算符就是用來格式化字元串的。在字元串內部,%s表示用字元串替換,%d表示用整數替換,%x表示16進制整數,有幾個%?佔位符,後面就跟幾個變數或者值,順序要對應好。如果只有一個%?,括弧可以省略。

格式化整數和浮點數還可以指定是否補0和整數與小數的位數:

>>> '%2d-%02d' % (3, 1)' 3-01'>>> '%.2f' % 3.1415926'3.14'

有些時候,字元串裡面的%是一個普通字元怎麼辦?這個時候就需要轉義,用%%來表示一個%:

>>> 'growth rate: %d %%' % 7'growth rate: 7 %'

G. python3.x默認使用的編碼是什麼

Python3.X 默認使用的編碼是 utf-8

H. python3.3.1怎麼設置默認編碼為utf-8

有個比較穩妥的辦法,讀寫文件的時候多加個參數,open('test.txt', 'r', encoding='utf-8')

I. python3.4 編碼有哪些

Python3中的編碼問題前,第一個段落對位元組、ASCII與Unicode與UTF-8等進行基本介紹,如果不對這幾種編碼犯頭暈,可直接跳過。
ASCII與Unicode與UTF-8與GBK

首先從老大哥說起。跟很多人一樣,大學讀了這么久,久仰ASCII編碼的大名。要說這個老大哥,我們再先從位元組說起。一個位元組包括八個比特位,每個比特位表示0或1,一個位元組即可表示從00000000到11111111共2^8=256個數字。一個ASCII編碼使用一個位元組(除去位元組的最高位作為作奇偶校驗位),ASCII編碼實際使用一個位元組中的7個比特位來表示字元,共可表示2^7=128個字元。比如那時寫C語言的程序,就經常要背下ASCII編碼中的01000001(即十進制的65)表示字元『A』,01000001加上32之後的01100001(即十進制的97)表示字元『a』。現在打開Python,調用chr和ord函數,我們可以看到Python為我們對ASCII編碼進行了轉換。

第一個00000000表示空字元,因此ASCII編碼實際上只包括了
字母、標點符號、特殊符號等共127個字元。因為ASCII是在美國出生的,對於由字母組成單詞進而用單詞表達的英文來說也是夠了。但是中國人、日本人、
韓國人等其他語言的人不服了。中文是一個字一個字,ASCII編碼用上了渾身解數256個字元都不夠用。

因此後來出現了Unicode編碼。Unicode編碼通常由兩個位元組組成,共表示256*256個字元,即所謂的UCS-2。某些偏僻字還會用到四個位元組,即所謂的UCS-4。也就是說Unicode標准也還在發展。但UCS-4出現的比較少,我們先記住:最原始的ASCII編碼使用一個位元組編碼,但由於語言差異字元眾多,人們用上了兩個位元組,出現了統一的、囊括多國語言的Unicode編碼。

在Unicode中,原本ASCII中的127個字元只需在前面補一個全零的位元組即可,比如前文談到的字元『a』:01100001,在Unicode中變成了00000000 01100001。不久,美國人不開心了,吃上了世界民族之林的大鍋飯,原本只需一個位元組就能傳輸的英文現在變成兩個位元組,非常浪費存儲空間和傳輸速度。

人們再發揮聰明才智,於是出現了UTF-8編碼。因為針對的是空間浪費問題,因此這種UTF-8編碼是可變長短的,從英文字母的一個位元組,到中文的通常的三個位元組,再到某些生僻字的六個位元組。解決了空間問題,UTF-8編碼還有一個神奇的附加功能,那就是兼容了老大哥的ASCII編碼。一些老古董軟體現在在UTF-8編碼中可以繼續工作。

注意除了英文字母相同,漢字在Unicode編碼和UTF-8編碼中通常是不同的。比如漢字的『中』字在Unicode中是01001110
00101101,而在UTF-8編碼中是11100100 10111000
10101101。

我們祖國母親自然也有自己的一套標准。那就是GB2312和GBK。當然現在挺少看到。通常都是直接使用UTF-8。記得我唯一一次看到GB編碼的網頁,是一個成人網站。

Python3中的默認編碼

Python3中默認是UTF-8,我們通過以下代碼:

import sys

sys.getdefaultencoding()

可查看Python3的默認編碼。

Python3中的encode和decode

Python3中字元編碼經常會使用到decode和encode函數。特別是在抓取網頁中,這兩個函數用的熟練非常有好處。我的理解,encode的作用,使我們看到的直觀的字元轉換成計算機內的位元組形式。decode剛好相反,把位元組形式的字元轉換成我們看的懂的、直觀的、「人模人樣」的形式。如下圖。

\x表示後面是十六進制,\xe4\xb8\xad即是二進制的11100100 10111000
10101101。也就是說漢字『中』encode成位元組形式,是11100100 10111000
10101101。同理,我們拿11100100
10111000 10101101也就是\xe4\xb8\xad來decode回來,就是漢字『中』。完整的應該是b'\xe4\xb8\xad',在Python3中,以位元組形式表示的字元串則必須加上前綴b,也就是寫成上文的b'xxxx'形式。

前文說的Python3的默認編碼是UTF-8,所以我們可以看到,Python處理這些字元的時候是以UTF-8來處理的。因此從上圖可以看到,就算我們通過encode('utf-8')特意把字元encode為UTF-8編碼,出來的結果還是相同:b'\xe4\xb8\xad'。

明白了這一點,同時我們知道UTF-8兼容ASCII,我們可以猜想大學時經常背誦的『A』對應ASCII中的65,在這里是不是也能正確的decode出來呢。十進制的65轉換成十六進制是41,我們嘗試下:

b'\x41'.decode()

結果如下。果然是字元『A』

Python3中的編碼轉換

據說字元在計算機的內存中統一是以Unicode編碼的。只有在字元要被寫進文件、存進硬碟或者從伺服器發送至客戶端(例如網頁前端的代碼)時會變成utf-8。但其實我比較關心怎麼把這些字元以Unicode的位元組形式表現出來,露出它在內存中的廬山正面目的。這里有個照妖鏡:

xxxx.encode/decode('unicode-escape')

輸出如下

b'\\u4e2d'還是b'\u4e2d,一個斜杠貌似沒影響。同時可以發現在shell窗口中,直接輸'\u4e2d'和輸入b'\u4e2d'.decode('unicode-escape')是相同的,都會列印出漢字『中』,反而是'\u4e2d'.decode('unicode-escape')會報錯。說明說明Python3不僅支持Unicode,而且一個『\uxxxx』格式的Unicode字元可被辨識且被等價於str類型。

如果我們知道一個Unicode位元組碼,怎麼變成UTF-8的位元組碼呢。懂了以上這些,現在我們就有思路了,先decode,再encode。代碼如下:

xxx.decode('unicode-escape').encode()

測試如下:

可以看到最後輸出的UTF-8位元組與上面的相同。嘗試成功。所以其他的編碼之間的轉換,大概也是如此。

最後的擴展

還記得剛剛那個ord嗎。時代變遷,老大哥ASCII被人合並,但ord還是有用武之地。試試ord('中'),輸出結果是20013。20013是什麼呢,我們再試試hex(ord('中')),輸出結果是'0x4e2d',也就是20013是我們在上文見面了無數次的x4e2d的十進制值。這里說下hex,是用來轉換成十六進制的函數,學過單片機的人對hex肯定不會陌生。

最後的擴展,在網上看到的他人的問題。我們寫下類似於'\u4e2d'的字元,Python3知道我們想表達什麼。但是讓Python讀取某個文件的時候出現了'\u4e2d',是不是計算機就不認識它了呢?後來下文有人給出了答案。如下:

import codecs

file = codecs.open( "a.txt", "r", "unicode-escape" )

u = file.read()

print(u)

熱點內容
編程鍵是什麼 發布:2024-09-20 07:52:47 瀏覽:651
學考密碼重置要求的證件是什麼 發布:2024-09-20 07:19:46 瀏覽:477
電腦主伺服器怎麼開機 發布:2024-09-20 07:19:07 瀏覽:728
2022款瑞虎升級哪些配置 發布:2024-09-20 06:59:07 瀏覽:264
資料庫與asp 發布:2024-09-20 06:55:25 瀏覽:727
python解釋編譯 發布:2024-09-20 06:52:57 瀏覽:648
舞蹈豐收腳本 發布:2024-09-20 06:36:26 瀏覽:595
linux進程埠號 發布:2024-09-20 06:36:11 瀏覽:80
派派怎麼改密碼忘了 發布:2024-09-20 06:25:49 瀏覽:780
linux虛擬地址物理地址 發布:2024-09-20 06:23:29 瀏覽:564