2010-12-12 6 views
3

사용할 수있는 공통 루틴 또는 라이브러리가 있습니까?C에서 HTML 문자열을 C 문자열로 변환하는 방법은 무엇입니까?

''이되어야합니다.

+0

시작을 위해 다음을 참조하십시오. http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references – Pirooz

+0

C? 그렇다면 왜? 그렇지 않다면 왜 지구상에서 ** 어떤 종류의 텍스트 조작을하기 위해 ** C를 선택하겠습니까? –

+0

미래에 누군가가 Google 번역을 위해 이것을 필요로하는 경우 두통에서 벗어나 HTML 출력 대신 텍스트 대신 Google 출력물을 요구하십시오. :) 문서가 도청되어 기본 출력물이 텍스트라고합니다. [JSON 구문 분석이 필요할 수도 있지만 쉽습니다. 에 대한 라이브러리를 찾으려면]. –

답변

1

누락 될 수 있습니다. 베어 - 뼈, 렛 모두-다른-걱정을-에 대해 - 더 - 메모리 관리, 기계, what's-A-정규식 방법 :

int hex_to_value(char hex) { 
    if (hex >= '0' && hex <= '9') { return hex - '0'; } 
    if (hex >= 'A' && hex <= 'F') { return hex - 'A' + 10; } 
    if (hex >= 'a' && hex <= 'f') { return hex - 'f' + 10; } 
    return -1; 
} 

void unescape(char* dst, const char* src) { 
    // Write the translated version of the text at 'src', to 'dst'. 
    // All sequences of '&#xx;', where x is a hex digit, are replaced 
    // with the corresponding single byte. 
    enum { NONE, AND, AND_HASH, AND_HASH_EX, AND_HASH_EX_EX } mode; 
    char first_hex, second_hex, translated; 
    mode m = NONE; 
    while (*src) { 
     char c = *src++; 
     switch (m) { 
      case NONE: 
      if (c == '&') { m = AND; } 
      else { *dst++ = c; m = NONE; } 
      break; 

      case AND: 
      if (c == '#') { m = AND_HASH; } 
      else { *dst++ = '&'; *dst++ = c; m = NONE; } 
      break; 

      case AND_HASH: 
      translated = hex_to_value(c); 
      if (translated != -1) { first_hex = c; m = AND_HASH_EX; } 
      else { *dst++ = '&'; *dst++ = '#'; *dst++ = c; m = NONE; } 
      break; 

      case AND_HASH_EX: 
      translated = hex_to_value(c); 
      if (translated != -1) { 
       second_hex = c; 
       translated = hex_to_value(first_hex) << 4 | translated; 
       m = AND_HASH_EX_EX; 
      } else { 
       *dst++ = '&'; *dst++ = '#'; *dst++ = first_hex; *dst++ = c; 
       m = NONE; 
      } 
      break; 

      case AND_HASH_EX_EX: 
      if (c == ';') { *dst++ = translated; } 
      else { 
       *dst++ = '&'; *dst++ = '#'; 
       *dst++ = first_hex; *dst++ = second_hex; *dst++ = c; 
      } 
      m = NONE; 
      break; 
     } 
    } 
} 

지루한, 합리적인 것보다 훨씬 더 많은 코드가 아니라 하드 :)

+0

또한 ISO-8859-1 이외의 항목 (또는 심지어 런타임 환경의 문자 집합에 얼마나 행운인지에 따라 ASCII)을 신경 쓰지 않는다고 가정합니다. –

+0

물론. 그러나 다시 우리가 그런 것을 신경 쓰면 우리는 왜 C를 사용할 것입니까? :) –

+0

... 사실, 번호가 매겨진 HTML 엔티티는 16 진수가 아닌 십진수를 사용합니다. 그렇죠? 한숨. 그래도 기본적인 아이디어를 얻을 수 있습니다. –

1

문자열에서 숫자를 파싱 한 다음 atoi을 사용하여 숫자로 변환 한 다음 문자로 변환하려고합니다.

char html[] = "&#39;"; 
    char* pch = &html[2]; 
    int n = 0; 
    char c = 0; 

    pch[2] = '\0'; 
    n = atoi(pch); 
    c = n; 

지금 C가 '입니다 :

이 ~이 완전히 인위적인 그래서 20초 내가 쓴 무언가이다. 또한 정말 ... HTML 문자열에 대해 알고하지 않습니다 그래서 당신에게 관리에 대한 &#xx; 스타일의 실체를 가정, 특히 어려운이 아닌 뭔가

1

"GNU recode"- 명령 행 프로그램과 라이브러리가 있습니다. http://recode.progiciels-bpi.ca/index.html

특히 HTML 문자를 인코딩/디코딩 할 수 있습니다.

+0

언뜻 보면 유망이지만 버려진 것처럼 보입니다. 최소한 컴파일 도구는 구식이며 심지어 autoreconf -f -i로도 수정되지 않습니다. –

+0

죄송합니다. 결코 그것을 만들려고 노력하지 않고, 나는 항상 적당한 단지 그것을 가지고있다. – hipe

+0

debian 소스 패키지에서 빌드를 시도했지만 작동합니다. 그것은 automake1.4가 필요합니다. – hipe

관련 문제