2010-01-24 2 views
3

필터를 사용하여 출력을 이스케이프 처리하는 좋은 방법이 있지만 그 중 아무 것도 올바른 작업을 수행하지 못합니다. 로 (65 개 문자 코드 (다른 사람의 사이에서) 0mako에서 출력 (XHTML 용)을 올바르게 이스케이프 처리하는 방법은 무엇입니까?

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 표준 유니 코드 컨소시엄 문자 레퍼토리를 사용하고, 그것은 정의되지 않은 잎 :

x=u"&\u0092" 

필터는 다음을 수행하십시오 문자열을 촬영 31 포함 127 ~ 159 포함)

이러한 문자는 누락 된 문자 인 것 같습니다. 어떤 아이디어?

편집

내가 파일을 오프라인으로 사용하는 경우 유효성을 검사하는 것 같다. 이것이 콘텐츠 유형 문제 일 수 있습니까?

답변

2

의도적으로 ASCII 문자 세트를 사용하지 않는 한 유니 코드 문자를 &#xxxx; 양식으로 변환하지 않아도 HTML로 작업 할 필요가 없습니다. 명명 된 엔티티를 이스케이프 처리 한 다음 전체 문자열을 UTF-8로 인코딩하고이를 작성하는 것이 더 간단하고 효율적입니다. 아마도 HTTP 헤더 나 <meta> 태그에 사용되는 인코딩을 선언해야합니다.

편집 :

내가 파일을 오프라인으로 사용하는 경우 유효성을 검사하는 것 같다. 이것이 콘텐츠 유형 문제 일 수 있습니까?

예. 당신은 UTF-8 문자셋을 적용하거나 직접 메타 태그를 통해 HTML에서 그것을 지정 HTTP 헤더를 사용 할 수 있습니다 : 옆

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

나는 그게 간단했지만 좋았어. * * UTF-8을 사용하고 있으므로 유효성이 검사되지 않습니다. – Draemon

+0

XHTML Strict로 유효합니다. HTML 4에는 문제가 있습니다. X가 아닌 HTML이 필요합니까? –

+0

XHTML Strict, UTF-8이며 온라인 및 오프라인 w3c 검사기에서 올바르게 감지됩니다. 그러나 온라인 유효성 검사기는 "텍스트에 불법 문자를 사용했습니다. HTML은 표준 UNICODE 컨소시엄 캐릭터 레퍼토리를 사용합니다" – Draemon

1

검증 문제, 그것은하지 않습니다 이러한 문자를 (제거 할 수 유용 어쨌든 신뢰성있게 표시하십시오) 없이는이 반드시 이스케이프됩니다.

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

그런 다음에 사용할 수 있어야합니다 : 당신이 environment.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) 

그리고이 목적을 위해 나는`lib 디렉토리/helpers.py '에 다음과 같은 기능을 추가 귀하의 템플릿 :

${c.content|n,sgmlsafe}