[英]Handling encode() when converting from python2 to python3
我正在努力將一個大項目從python2
轉換為python3
(不需要python2
向后兼容)。
在測試轉換時,我發現我遇到了某些字符串被轉換為bytes
對象的問題,這導致了問題。 我將其追溯到以下方法,該方法在許多地方被調用:
def custom_format(val):
return val.encode('utf8').strip().upper()
在python2
:
custom_format(u'\xa0')
# '\xc2\xa0'
custom_format('bar')
# `BAR`
在python3
:
custom_format('\xa0')
# b'\xc2\xa0'
custom_format('bar')
# b`BAR`
這是一個問題的原因是因為在某些時候, custom_format
的輸出意味着使用format()
插入到SQL
模板字符串中,但是'foo = {}'.format(b'bar') == "foo = b'BAR'"
,這會搞亂SQL
語法的潛力。
簡單地刪除encode('utf8')
部分將確保custom_format('bar')
正確返回'BAR'
,但現在custom_format('\\xa0')
返回'\\xa0'
而不是'\\xc2\\xa0'
python2
版本。 (雖然我對unicode知之甚少,不知道這是不是壞事)
在不弄亂代碼的SQL
或format()
部分的情況下,如何確保python3
版本中展示python2
版本的預期行為? 它是否像丟棄encode('utf8')
一樣簡單,還是會導致意外沖突?
如果您的目的是確保所有傳入的字符串,無論是str
還是bytes
,都要轉換為bytes
,那么您必須保持encode
因為Python3使用str
而不是bytes
(Python2就是這種情況)作為本機字符串類型。 encode
將str
轉換為bytes
。
如果您的目的是確保查詢正確。 然后你可以刪除encode
,讓Python3為你處理事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.