簡體   English   中英

從python2轉換為python3時處理encode()

[英]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知之甚少,不知道這是不是壞事)

在不弄亂代碼的SQLformat()部分的情況下,如何確保python3版本中展示python2版本的預期行為? 它是否像丟棄encode('utf8')一樣簡單,還是會導致意外沖突?

如果您的目的是確保所有傳入的字符串,無論是str還是bytes ,都要轉換為bytes ,那么您必須保持encode因為Python3使用str而不是bytes (Python2就是這種情況)作為本機字符串類型。 encodestr轉換為bytes

如果您的目的是確保查詢正確。 然后你可以刪除encode ,讓Python3為你處理事情。

暫無
暫無

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

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