2017-05-03 112 views
0

我試圖寫一個包含西里爾符號(以UTF-8)格式的字符串爲Unix管道都:如何編碼字符串轉換爲UTF-8的Python 2.x和3.x

sort_proc.stdin.write("{}\n".format(cyrillic_text).decode('utf-8').encode('utf-8')) 

我不得不編碼,因爲'str' does not support the buffer interface和解碼,因爲'ascii' codec can't decode byte 0xd0。所以這個代碼按照預期在Python 2.7中工作。但Python 3.4說'str' object has no attribute 'decode' python3中的字符串文字已經被「解碼」了。所以我知道如何分別爲每個版本修復它,但不知道如何解決這兩個問題。我發現了一個與重新加載sys模塊和設置setdefaultencoding有關的解決方案,但是這篇文章why should we NOT use sys.setdefaultencoding表示這只是一個黑客,不應該被使用。請張貼這些事情的最pythonic方式。謝謝。

+3

可以執行根據版本不同的代碼:'如果sys.version_info [0] == 2:....其他:....' – DyZ

+0

什麼'.decode( 'UTF-8')。編碼('utf-8')'實現?看起來不太有意義。 –

+0

@StefanPochmann我認爲編碼沒有解碼使用默認ascii編解碼器,這就是爲什麼它不能解碼'0xd0'。一般來說,它不使用python2編碼,但不能在python3 – Alex

回答

1

使用unicode strings(而不是8位str)整個的Python 2.x的代碼。這相當於Python 3.x str類型。然後,你可以簡單地使用the_string.encode('UTF-8')得到字節的字符串(在2.X str類型,但在bytes 3.X)。

如果您不需要通過3.2支持的Python 3.0,你可以用u前綴所有的字符串文字。在Python 2.x中,這會創建一個unicode字符串,並在3.3 + it's supported for backwards compatibility中但不做任何事情。