Python 如何在mako中正确转义输出(对于XHTML)?
尽管使用过滤器提供了一种很好的逃避输出的方法,但它们都没有做正确的事情。 以字符串为例:Python 如何在mako中正确转义输出(对于XHTML)?,python,xhtml,unicode,escaping,mako,Python,Xhtml,Unicode,Escaping,Mako,尽管使用过滤器提供了一种很好的逃避输出的方法,但它们都没有做正确的事情。 以字符串为例: 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 esca
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个字符)
这些似乎是错过的角色。有什么想法吗
编辑
它似乎验证了我是否脱机使用该文件。这可能是内容类型问题吗?无需将Unicode字符转换为
xxx除非您有意使用ASCII字符集,否则代码>表单将在HTML中工作。转义命名实体,然后将整个字符串编码为UTF-8并这样写出,这样更简单、更高效。您可能应该声明HTTP头或
标记中使用的编码
编辑:
它似乎验证了我是否脱机使用该文件。这可能是内容类型问题吗
对。您可以使用HTTP头强制使用UTF-8字符集,也可以直接通过元标记在HTML中指定它:
<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8" />
除了验证问题,删除这些字符(无论如何都不能可靠地显示)而不必转义任何其他内容是很有用的。为此,我在'lib/helpers.py'中添加了以下函数:
__sgml_invalid = re.compile(r'[\x82-\x8c\x91-\x9c\x9f]', re.UNICODE)
def sgmlsafe(text):
lookup = {
130:"‚", #Single Low-9 Quotation Mark
131: "ƒ", #Latin Small Letter F With Hook
132:"„", #Double Low-9 Quotation Mark
133:"…", #Horizontal Ellipsis
134:"†", #Dagger
135:"‡", #Double Dagger
136: "ˆ", #Modifier Letter Circumflex Accent
137:"‰", #Per Mille Sign
138: "Š", #Latin Capital Letter S With Caron
139:"‹", #Single Left-Pointing Angle Quotation Mark
140: "Œ", #Latin Capital Ligature OE
145:"‘", #Left Single Quotation Mark
146:"’", #Right Single Quotation Mark
147:"“", #Left Double Quotation Mark
148:"”", #Right Double Quotation Mark
149:"•", #Bullet
150:"–", #En Dash
151:"—", #Em Dash
152: "˜", #Small Tilde
153:"™", #Trade Mark Sign
154: "š", #Latin Small Letter S With Caron
155:"›", #Single Right-Pointing Angle Quotation Mark
156: "œ", #Latin Small Ligature OE
159: "Ÿ" #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}
我希望事情能这么简单,但事实并非如此。我使用的是UTF-8,它不会验证。验证很好,就像XHTML一样严格。HTML4确实有问题。您需要非X HTML吗?它是严格的XHTML,UTF-8,并且由在线和离线w3c验证器正确地检测到。但是在线验证器告诉我“你在文本中使用了非法字符。HTML使用了标准的UNICODE联合字符库”,我无法复制它。通过上载验证,可以验证文件中有“<代码> \U90092/代码>(<代码> \xC2\x92 < /COD> UTF-8)字符的文件。仍然失败。我必须使用w3c验证器(v0.7.4)的本地副本来测试实时内部开发站点(出于某种原因,它在标题中作为plain/html提供)。如果我能找到一种方法来更改标题,我会的,否则至少我知道它会在实际运行后进行验证。