簡體   English   中英

python 關於編解碼器和 utf-8 的菜鳥問題

[英]python noob question about codecs and utf-8

使用 python 來挑選它,所以絕對是菜鳥? 在這里但沒有看到滿意的答案。

我有一個 json utf-8 文件,其中一些片段有墳墓,acute's等......我正在使用編解碼器並且有(例如):

str=codecs.open('../../publish_scripts/locations.json', 'r','utf-8')
locations=json.load(str)

for location in locations:
    print location['name']

對於打印,有什么特別需要做的嗎? 它給了我以下
ascii'編解碼器無法在 position 5 中編碼字符 u'\xe9'

它看起來像是 e-accute 的正確 utf-8 值。 我懷疑我在打印方面做錯了什么。 迭代會導致它失去它的 utf-8'ness 嗎?

PHP 和 Ruby 版本處理 utf-8 件很好; python 不會做的那些語言中是否存在一些松散?

謝謝

codec.open() 將使用您提供的編解碼器 (utf-8)解碼文件的內容。 然后你有一個 python unicode object (其行為類似於字符串對象)。

打印 unicode object 將導致使用默認編解碼器進行隱式(幕后)編碼,通常是ascii 如果ascii不能編碼所有存在的字符,它將失敗。

要打印它,您應該首先對其進行編碼,因此:

for location in locations:
    print location['name'].encode('utf8')

編輯:

為了您的信息, json.load()實際上需要一個類似文件的 object (這是codecs.open()返回的內容)。 此時您所擁有的既不是字符串也不是 unicode object,而是文件周圍的可迭代包裝器。

默認情況下json.load()期望文件為 utf8 編碼,因此您的代碼片段可以簡化:

locations = json.load(open('../../publish_scripts/locations.json'))
for location in locations:
    print location['name'].encode('utf8')

您可能正在正確讀取文件。 打印時發生錯誤。 Python 嘗試將 unicode 字符串轉換為 ascii,並在 position 5 中的字符上失敗。

試試這個:

print location['name'].encode('utf-8')

如果您的終端設置為期望 utf-8 格式的 output,這將正確打印。

它與 PHP 中的相同。 UTF8 字符串很適合打印。

對於非 ascii、python2 中的字符 io 和一些site.py設置,標准的 io 流被破壞。 基本上,您需要很早就在腳本中使用sys.setdefaultencoding('utf8') (或任何系統區域設置的編碼)。 使用 ubuntu 中的site.py ,您需要imp.reload(sys)以使sys.setdefaultencoding可用。 或者,您可以將 sys.stdout(以及 stdin 和 stderr)包裝為支持 unicode 的讀取器/寫入器,您可以從codecs.getreader / getwriter獲得。

暫無
暫無

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

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