2010-01-24 20 views
3

儘管提供了一個很好的方式來使用過濾器來轉義輸出,但他們都沒有做正確的事情。 以字符串:如何在mako中正確地轉義輸出(用於XHTML)?

x=u"&\u0092" 

過濾器做到以下幾點:

x    Turns the & into an entity but not the \u0092 (valid XML but not XHTML) 
h    Exactly the same 
u    Escapes both, but obviously uses url escaping 
entities  Only converts named entities, so again only the & is escaped 
decode.latin1 The same 

HTML使用標準Unicode協會字符集,並留下未定義(其中包括)65個字符代碼(0〜 31,含127和159)

這些似乎是錯過的人物。有任何想法嗎?

編輯

這似乎驗證了,如果我使用的文件脫機。這可能是內容類型問題嗎?

回答

2

除非您故意使用ASCII字符集,否則不需要將Unicode字符轉換爲&#xxxx;格式以使用HTML格式。轉義命名實體更簡單高效,然後將整個字符串編碼爲UTF-8並將其寫出。您應該聲明HTTP標頭中或<meta>標籤中使用的編碼。

編輯:

這似乎驗證了,如果我使用的文件脫機。這可能是內容類型問題嗎?

是的。您可以使用HTTP頭強制執行UTF-8字符集或通過meta標籤直接在HTML指定:

<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8" /> 
+0

我希望它那麼簡單,但事實並非如此。我*我*使用UTF-8,它不會驗證。 – Draemon 2010-01-24 03:58:49

+0

驗證XHTML嚴格。雖然HTML 4確實有問題。你需要它是非X的HTML嗎? – 2010-01-24 04:05:46

+0

它是XHTML嚴格的,UTF-8,並且由在線和離線w3c驗證程序正確檢測到。但在線驗證器告訴我:「您在文本中使用了非法字符,HTML使用標準UNICODE聯盟字符庫」 – Draemon 2010-01-24 04:40:16

1

撇開驗證的問題,這是很有用,能夠去除這些字符(不無論如何顯示可靠)沒有必然逃脫其他任何東西。爲此我增加了以下功能'的lib/helpers.py「:

__sgml_invalid = re.compile(r'[\x82-\x8c\x91-\x9c\x9f]', re.UNICODE) 

def sgmlsafe(text): 
    lookup = { 
     130:"&#8218;", #Single Low-9 Quotation Mark 
     131: "&#402;", #Latin Small Letter F With Hook 
     132:"&#8222;", #Double Low-9 Quotation Mark 
     133:"&#8230;", #Horizontal Ellipsis 
     134:"&#8224;", #Dagger 
     135:"&#8225;", #Double Dagger 
     136: "&#710;", #Modifier Letter Circumflex Accent 
     137:"&#8240;", #Per Mille Sign 
     138: "&#352;", #Latin Capital Letter S With Caron 
     139:"&#8249;", #Single Left-Pointing Angle Quotation Mark 
     140: "&#338;", #Latin Capital Ligature OE 
     145:"&#8216;", #Left Single Quotation Mark 
     146:"&#8217;", #Right Single Quotation Mark 
     147:"&#8220;", #Left Double Quotation Mark 
     148:"&#8221;", #Right Double Quotation Mark 
     149:"&#8226;", #Bullet 
     150:"&#8211;", #En Dash 
     151:"&#8212;", #Em Dash 
     152: "&#732;", #Small Tilde 
     153:"&#8482;", #Trade Mark Sign 
     154: "&#353;", #Latin Small Letter S With Caron 
     155:"&#8250;", #Single Right-Pointing Angle Quotation Mark 
     156: "&#339;", #Latin Small Ligature OE 
     159: "&#376;"  #Latin Capital Letter Y With Diaeresis 
     } 

    return __sgml_invalid.sub(lambda x: lookup[ord(x.group())], text) 

,您可以通過編輯environment.py使這個可以用作過濾條件:

config['pylons.app_globals'].mako_lookup = TemplateLookup(
    ... 
    imports=[....,'from appname.lib.helpers import sgmlsafe',...] 

應該然後提供給你的模板:

${c.content|n,sgmlsafe}