簡體   English   中英

Python:“...”.encode(“utf8”)修復了什么?

[英]Python: what does “…”.encode(“utf8”) fix?

我想url編碼python字符串並獲得希伯來字符串的異常。 我無法解決它並開始做一些猜測導向的編程。 最后,在將它發送到url編碼器之前做mystr = mystr.encode("utf8")保存了一天。

有人可以解釋發生了什么嗎? .encode(“utf8”)有什么作用? 我的原始字符串無論如何都是unicode字符串(即以au為前綴)。

我的原始字符串無論如何都是unicode字符串(即以au為前綴)

......這是問題所在。 它不是“字符串”,而是“Unicode對象”。 它包含一系列Unicode代碼點。 當然,這些代碼點必須具有Python所知道的一些內部表示,但無論它是什么都被抽象出來,當你print repr(my_u_str)時它們被顯示為\\uXXXX實體。

要獲得另一個程序可以理解的字節序列,您需要獲取Unicode代碼點序列並對其進行編碼。 您需要決定編碼,因為有很多可供選擇。 UTF8和UTF16是常見的選擇。 ASCII也可以,如果它適合。 u"abc".encode('ascii')工作得很好。

my_u_str = u"\ℙython" ,然后type(my_u_str)type(my_u_str.encode('utf8'))以查看類型的差異:第一個是<type 'unicode'> type(my_u_str.encode('utf8')) <type 'unicode'> ,第二個是<type 'str'> (無論如何,在Python 2.5和2.6下)。

Python 3中的情況有所不同,但由於我很少使用它,如果我試圖說出任何權威的話,我就會說出來。

原始字符串是包含原始Unicode代碼點的unicode對象,在將其編碼為UTF-8之后,它是包含UTF-8編碼數據的普通字節字符串。

URL編碼器似乎需要一個字節字符串,因此它可以對一個接一個的字節進行URL編碼,而不必處理Unicode代碼點。 當你給它一個unicode對象時,它會嘗試使用一些默認編碼將其轉換為字節字符串,可能是ASCII。 對於無法表示為ASCII的希伯來字符,這將導致錯誤。

.encode(“utf8”)有什么作用?

這取決於您使用的Python版本:

  • 在Python 3.x中,它將str對象(以UTF-16或UTF-32編碼)轉換為包含字符串的UTF-8表示的bytes對象。
  • 在Python 2.x中,它將unicode對象轉換為以UTF-8編碼的str對象。 str也有encode方法,寫'...'.encode('UTF-8')相當於寫'...'.decode('ascii').encode('UTF-8')

由於您提到了“u”前綴,因此必須使用2.x. 如果您不需要任何2.x-only庫,我建議切換到3.x,它在文本和二進制數據之間有明顯的區別。

深入研究Python 3可以很好地解釋這個問題。

有人可以解釋發生了什么嗎?

如果您告訴我們錯誤消息是什么會有所幫助。

urllib.quote函數需要一個str對象。 它也適用於僅包含ASCII字符的unicode對象,但在包含希伯來字母時則不行。

在Python 3.x中, urllib.parse.quote接受str (= Python 2.x unicode )和bytes對象。 字符串以UTF-8自動編碼。

“...”。encode(“utf-8”)將字符串的內存中表示轉換為UTF-8編碼的字符串。

url編碼器可能期望一個字節串,即字符串表示,其中每個字符用單個字節表示。

它返回Unicode字符串的UTF-8編碼版本mystr。 重要的是要意識到UTF-8只是編碼Unicode的一種方式。 Python可以與許多其他編碼一起使用(例如,mystr.encode(“utf32”)或甚至mystr.encode(“ascii”))。

balpha發布的鏈接解釋了這一切。 簡而言之:

你的字符串以“u”為前綴這一事實意味着它由Unicode 字符 (或代碼點)組成。 UTF-8是將此字符串編碼為字節序列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM