簡體   English   中英

讀取UTF8編碼的CSV並將其轉換為UTF-16

[英]Reading UTF8 encoded CSV and converting to UTF-16

我正在讀取具有UTF8編碼的CSV文件:

ifile = open(fname, "r")
for row in csv.reader(ifile):
    name = row[0]
    print repr(row[0])

這可以正常工作,並打印出我希望打印出的內容; UTF8編碼的str

> '\xc3\x81lvaro Salazar'
> '\xc3\x89lodie Yung'
...

此外,當我只打印str (與repr()相對)時,輸出顯示ok(無論如何我都不明白-這是否會導致錯誤?):

> Álvaro Salazar
> Élodie Yung

但是當我嘗試將我的UTF8編碼的strs轉換為unicode

ifile = open(fname, "r")
for row in csv.reader(ifile):
    name = row[0]
    print unicode(name, 'utf-8')  # or name.decode('utf-8')

我臭名昭著:

Traceback (most recent call last):                                       
File "scripts/script.py", line 33, in <module>
    print unicode(fullname, 'utf-8')
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc1' in position 0: ordinal not in range(128)

因此,我查看了創建的unicode字符串:

ifile = open(fname, "r")
for row in csv.reader(ifile):
    name = row[0]
    unicode_name = unicode(name, 'utf-8')
    print repr(unicode_name)

輸出是

 > u'\xc1lvaro Salazar'
 > u'\xc9lodie Yung'

因此,現在我完全感到困惑,因為這些值似乎是錯誤的十六進制值。 我讀過這個問題:

看來我做得一切正確,使我相信我的文件實際上不是UTF8,但是當我最初打印出單元格的repr值時,它們似乎可以糾正UTF8十六進制值。 任何人都可以指出我的問題或指出我的理解在哪里破裂(因為我開始迷失在編碼的叢林中)


順便說一句,我相信我可以使用codecs打開文件並將其直接讀取到unicode對象中,但是csv模塊本身不支持unicode,因此我可以使用這種方法。

您的默認編碼是ASCII。 因此,當您嘗試打印unicode對象時,解釋器將嘗試使用ASCII編解碼器對其進行編碼,這會失敗,因為您的文本包含了ASCII中不存在的字符。

打印UTF-8編碼的字節串不會產生錯誤的原因(這似乎會讓您感到困惑,盡管應該不會),原因是這只是將字節發送到您的終端。 盡管您的終端不知道如何處理字節,但是它永遠不會產生Python錯誤,盡管它可能會產生難看的輸出。

要打印unicode,請使用print some_unicode.encode('utf-8') (或您的終端實際使用的任何編碼)。

至於u'\\xc1lvaro Salazar' ,這里什么也沒弄亂。 字符Á位於Unicode代碼點C1(與UTF-8表示形式無關,但恰好與Latin-1中的值相同),Python使用\\x十六進制轉義符代替\\u\u003c/code> Unicode代碼點表示法對於將00作為最高有效字節以節省空間的代碼點(它也可能顯示為

為了全面了解Unicode在Python中的工作方式,我建議http://nedbatchelder.com/text/unipain.html

暫無
暫無

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

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