簡體   English   中英

python中u''前綴和unicode()有什么區別?

[英]What is the difference between u' ' prefix and unicode() in python?

u''前綴和unicode()什么區別?

# -*- coding: utf-8 -*-
print u'上午'  # this works
print unicode('上午', errors='ignore') # this works but print out nothing
print unicode('上午') # error

對於第三個print ,錯誤顯示:UnicodeDecodeError:'ascii'編解碼器無法解碼位置0中的字節0xe4

如果我有一個包含非ascii字符的文本文件,例如“上午”,如何閱讀並正確打印出來?

  • u'..'是一個字符串文字,並根據源編碼聲明解碼字符。

  • unicode()是一個將另一個類型轉換為unicode對象的函數,你給它一個字節字符串文字 它將根據默認的ASCII編解碼器解碼字節字符串。

因此,您使用不同類型的文字表示法創建了一個字節字符串對象,然后嘗試將其轉換為unicode()對象,該對象失敗,因為str - > unicode轉換的默認編解碼器是ASCII。

這兩個是完全不同的野獸。 如果你想使用后者,你需要給它一個明確的編解碼器:

print unicode('上午', 'utf8')

這兩者的相關性與使用0xFFint('0xFF', 0)相關的方式相同; 前者使用十六進制表示法定義值255的整數,后者使用int()函數從字符串中提取整數。

另一種方法是使用str.decode()方法

print '上午'.decode('utf8')

除非你知道自己在做什么,否則不要試圖使用錯誤處理程序(例如ignore''replace' )。 'ignore'尤其可以掩蓋選擇錯誤編解碼器的潛在問題。

您可能想要閱讀Python和Unicode:

strPython 2.7.x沒有以u''為前綴時,解釋器看到的是一個字節字符串,沒有顯式編碼。

如果您沒有告訴解釋器在執行unicode()時如何處理這些字節,它將(如您所見)默認嘗試通過ascii編碼方案decode它看到的字節。

它是嘗試將str的普通字節轉換為unicode對象的初步步驟。

使用ascii進行decode意味着:嘗試使用硬編碼映射( 0127之間的數字)來解釋str每個字節。

您遇到的錯誤就像一個dict KeyError :解釋器遇到一個ascii編碼方案沒有指定映射的字節。

由於解釋器不知道如何處理字節,因此會拋出錯誤。

您可以通過告訴解釋器使用另一組編碼/解碼映射來decode字節來改變該初步步驟,而不是ascii,例如UTF-8 ,如其他答案中詳細說明的那樣。

如果解釋器在str中的每個字節(或字節)中找到所選方案中的映射,則它將成功解碼,並且解釋器將使用生成的映射來生成unicode對象。

Python unicode對象是一系列Unicode 代碼點 Unicode 代碼空間中有1,112,064個有效代碼點。

如果您選擇用於解碼的方案是您的文本(或代碼點)編碼的方案,則打印時的輸出應與原始文本相同。

也可以考慮嘗試Python 3 相關的差異在下面的第一條評論中解釋。

Unicode是一種對象類型,而“u”是用於表示該對象是unicode對象的文字。 它類似於用於表示long int的'L'文字。

請嘗試:'上午'.decode('utf8','ignore')。encode('utf8')

暫無
暫無

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

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