2012-04-08 2 views
2

HTML 문자열을 구문 분석하고 쿼리를 수행하고 일부 노드를 얻은 다음 이러한 노드에 대해 HTML을 출력하는 메소드를 작성하고 있습니다.libxml을 사용하여 HTML 엔터티 유지

나는 libxml을 사용하고, 입력 HTML을로드하고 구문 분석 관리해야하고, 출력은 내가 모든 HTML 엔티티 보존 원하고, libxml 것을 제외하고, 원하는 노드에 대한 HTML 문자열이 변환 보인다 연관된 UTF-8 문자로 변환합니다. 그 문자 엔티티가 변환됩니다 제외하고,이 노드 벌금의 HTML 콘텐츠를 덤프

NSString *HTMLString = ... 
NSData *documentData = [HTMLString dataUsingEncoding:NSUTF8StringEncoding]; 

//Create the document 
xmlDocPtr doc = htmlReadMemory([documentData bytes], 
           [documentData length], 
           "", 
           NULL, 
           HTML_PARSE_NOWARNING | HTML_PARSE_NOERROR); 

//Get the node I want to output 
xmlNodePtr node = ... 

//Create the node buffer and fill it with the node content 
xmlBufferPtr nodeBuffer = xmlBufferCreate(); 
htmlNodeDump(nodeBuffer, doc, node); 

... 

: 여기

내가 (코드는 오브젝티브 C 프로젝트의 일부입니다) 지금까지있어 무엇 UTF-8 문자 - 입력 HTML에 존재하는 유일한 엔터티는 ’‘과 같은 따옴표입니다. 노드의 HTML 콘텐츠를 쓸 때 보존하려고합니다.

HTML 구문 분석 및 HTML 트리 기능과 관련된 libxml 문서를 검토 한 결과 HTML 엔티티에 대한 정보를 찾지 못하는 것 같습니다. 나는 이것이 파싱이나 출력 중에 이루어지는 것인지에 대해서도 확신하지 못한다. 나는 단순히 노드의 내용을 xmlNodeGetContent()을 사용하여 출력하려고 시도했으며 엔티티도 상응하는 UTF8 문자로 대체 되었기 때문에 구문 분석 문제로 의심 스럽지만 잘 모르겠습니다.

답변

3

문제는 libxml이 모든 HTML 문자 엔티티를 UTF-8 문자로 변환하는 UTF-8 (Encodings Support에서 설명 됨)과 함께 내부적으로 작동하므로 HTML을 출력 할 때 변환 된 것으로 남겨 둡니다. UTF-8 문자.

용액은 또한 '기본 지원 인코딩'아래 xmlsoft의 인코딩 부에 제공된다 :

libxml2를가 (encoding.c에있는) 다음의 인코딩을위한 기본 변환기의 세트를 가지고

UTF-8이 기본적으로 지원됩니다
  1. (널 (null) 핸들러)
  2. UTF-16, 크고 작은 엔디안
  3. ISO 라틴어-1 (ISO-8859-1)를 모두 포함하는 대부분의 서양 언어
  4. ASCII, 주로 저장에 유용합니다.
  5. HTML, &과 같은 HTML 사전 정의 된 엔티티를 사용하여 UTF-8을 ASCII로 변환하는 특정 처리기. 저작권 표시.

은 또한 다른 값으로 인코딩 libxml 함수로부터 반환 변환 'UTF8Toisolat1 같이 "변환 함수를 사용하도록 권장한다.

해결책은 비 ASCII 문자를 관련 HTML 엔터티 (예 : &rsquo; 또는 &lsquo;)로 바꿀 UTF8ToHtml() 함수를 사용하여 HTML 출력을 변환하는 것입니다. 이것은 &lt;&gt;으로 대체하는 htmlEncodeEntities()으로 시도한 것과 달리 HTML 태그 <> 문자를 그대로 유지하는 것으로 보입니다.

UTF8ToHtml()을 사용할 때 해결하지 못한 한 가지 방법은 출력 버퍼에 할당 할 메모리 양을 결정하는 방법이었습니다. 단일 문자를 엔티티로 바꾸면 HTML 문자열 길이가 늘어나므로 입력 HTML의 길이를 사용하십시오. 단순히 입력 버퍼 크기의 두 배를 할당했는데 (실제로 사용하는 모든 경우에 대해 충분해야 함) 사용 된 실제 길이 (UTF8ToHtml()의 포인터 매개 변수를 통해 반환 됨)가 사용되었지만 이것을하는 더 좋은 방법.

관련 문제