[英]python strings and binary data
我的問題是關於python 3.0字符串。
我的理解是,對於行str = "a"
,字符'a'被編碼(例如使用utf-8)並存儲在str對象中。 如果'a'的UTF-8表示是1字節,則字符串是1字節長。 我對嗎?
如果上述情況屬實,當我們使用read()讀取二進制文件時會發生什么。 假設我有一個帶有兩個字節的二進制數據的雙字節文件,我使用read命令在字符串中讀取它
open(fileName, mode='rb') str= file.read()
現在str
將是兩個字節長,每個字節將存儲在fileName中。 我對嗎?
如果我在上面的點是對的,那么str對象不是任何特定的編碼格式(如UTF等),那么python字符串總是unicode是什么意思呢? 如果我調用str.encode()會發生什么。 這沒有意義嗎?
從文件讀取的str
對象實際上是一個字節數組。 有沒有辦法將其轉換為bytearray類型?
你很困惑。 “編碼”屬於字節字符串 ,而不是unicode字符串 。 有意義的語句:“此字節字符串是utf-8編碼的。”,“此字節字符串長度為2個字節。” 無意義的語句:“這個unicode字符串是utf-8編碼的”,“這個unicode字符串是2個字節長”
str = "a"
表示“創建一個unicode字符串'a'和一個名為str
的引用”。 Unicode字符串當然存儲在某種編碼中,因為它需要在內存中作為字節存在,但這並不重要。 您的所有代碼都將其視為根本沒有編碼 - 它已從字節中抽象出來。 unicode字符串是一系列unicode代碼點 (即表示字符的整數)。 str
here( read()
的返回值)是字節字符串 ,而不是unicode字符串 。 "a" != b"a"
。 str
具有未知編碼 ,必須進行解碼才能生成unicode字符串。 字節字符串沒有encode()
方法,因為它沒有意義 - 它們或者已經是unicode字符串的編碼,或者它們根本不表示unicode字符串(例如圖像)。 bytearray
是一個可變的字節列表。 您可以使用bytearray(byte_string)
生成bytearray,但是bytearrays用於相當專業的用途(例如,避免復制send-recv緩沖區),而不是偶然使用。 通常你只需要一個字節串。 Python字符串存儲Unicode代碼點 。
代碼點與字節不同。 字節是數字的計算機表示(通常在0到255之間),並且這些數字可以通過解碼過程轉換為代碼點,而在另一個方向上通過編碼轉換。 Python 3字符串包含代碼點,每個字符對應一個字符。
Python源代碼可以使用一系列字節定義字符串文字,默認情況下解釋器使用UTF-8編解碼器解碼為unicode,但您可以在文件頂部設置其他編解碼器。 在磁盤上,UTF-8編碼中的字母a
確實只是一個字節,這是UTF-8標准的性質。
如果您在文本模式下讀取文件,Python會自動為您應用解碼過程,但是當您以二進制模式打開它時,不會進行解碼,而是獲得bytes
對象。 該對象的內容應該完全反映文件的內容。 請注意,它不是 str
類型,它不是unicode,它甚至不是Python字符串。 要將字節轉換為字符串,您需要使用.decode()
方法顯式解碼。
從bytes
值中簡單地創建一個bytearray
,只需在其上調用bytesarray()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.