2015-11-13 25 views
1

我有以下代碼:如何爲特定的Python類啓用解碼?

return render_template(
     'sample.html', 
     title=('Härre').decode('utf-8'), 
     year=datetime.now().year, 
     message = ("Härre guut").decode('utf-8') 
    ) 

上面的代碼是工作的罰款。但是我想知道是否有可能爲特定類的特殊字符啓用自動解碼?以便我的代碼變成這樣:

return render_template(
     'sample.html', 
     title=('Härre'), 
     year=datetime.now().year, 
     message = ("Härre guut") 
    ) 

如果是,那麼它是如何完成的?

在我的情況下,特殊字符是字母ä,它可以用utf-8解碼。

我試圖在我的第一行代碼中添加以下行:

# -*- coding: utf-8 -*- 

但是那也不會幫助。如果我嘗試啓用上面一行,並採取了一切decode('utf-8')部分我得到以下錯誤:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 12: ordinal not in range(128) 

,這是非常明顯的錯誤。它試圖使用'ascii'編解碼器來解碼代碼的特殊字符。

如果你想知道爲什麼我想啓用這樣的功能,答案是,將來我會有更多的render_template()方法。該方法與Flask框架一起使用。

+0

它是Python2嗎?請在您的問題中添加[python-3.x]或[python-2.x]標籤。 – GingerPlusPlus

+0

@GingerPlusPlus:它是Python 2.7 –

回答

1

如果風險太小,可以使用Python 3自動進行解碼,而Python 3使用Unicode而不是ascii。否則,正如Brandon所指出的那樣,您必須對Python 2採取適當的解碼方式,在程序中使用Unicode,在輸出數據時使用Unicode,在輸出數據時使用編碼,通常使用utf- 8,但什麼都適合你。

在「邊緣」進行解碼和編碼以及在兩者之間使用Unicode是很多工作,但是很有必要。這是一個很好的理由,使開關到Python 3 :-)

+0

我會使用它,但是爲什麼我必須使用老一些的限制。解釋:)有點複雜。但我現在已經忍受了使用decode()的痛苦,或嘗試使用@NotAnAmbiTurner的建議。也感謝你:) –

+0

@Amir:爲了獲得Python 2上的unicode文字,只需在模塊的頂部添加'from __future__ import unicode_literals'就可以了,你需要這種行爲(替代方法是標記每個單獨的字符串與'u'''相反,但更容易做相反的事情,即如果需要的話,在二進制數據中添加'b''')。你不需要爲此改變Python版本(儘管在Python 3上測試單個模塊(如果你的應用程序允許編寫單一源碼Python 2/3兼容代碼))至少有用。 – jfs

+0

尼斯J.F.塞巴斯蒂安;將來我需要跨版本兼容性時使用它。 – binarysubstrate

2

如果您只是在談論您正在輸入的字符串,我會嘗試在它們前面放置一個u(例如,u'string')。 u告訴python該字符串是unicode。我過去在類似的情況下成功地使用了它。

此外,根據flask docs(在底部的方式),使用該# -*- coding: ...位正確,你必須設置你的文本編輯器UTF-8,否則它保存在ascii,這可能是爲什麼你還在得到那個錯誤。

+1

是的,但這應該是*答案*,不是主意。想法的正確位置是評論。 – GingerPlusPlus

+1

我不能評論! D:另外,注意到。我顯然無法測試它,但過去在類似情況下,這個小'u'已經爲我工作了。 – NotAnAmbiTurner

+1

不能評論爲新用戶是最糟糕的。我希望他們能改變這一點。 – binarysubstrate

1

簡單地定義你的字符串作爲使用u前綴Unicode字符串:

return render_template(
     'sample.html', 
     title=(u'Härre'), 
     year=datetime.now().year, 
     message = (u"Härre guut") 
) 

因爲你已經出爐非ASCII到你的源代碼,在你的源代碼的頂部設置'編碼'位。確保編輯器的字符編碼與coding標題匹配。

# -*- coding: utf-8 -*- 
相關問題