다중언어 마크업(polyglot markup)

dev | 2010-12-28

XHTML2가 중단되고 HTML5가 급성장하고 있다. 하지만 나를 포함한 주변의 몇몇 XHTML의 강한 문법 규칙을 옹호하는 사람들은 HTML5의 너무 관대한 문법 규칙이 웹을 더 망치는 것이 아닌가 우려하고 있다. 물론 관대한 문법 규칙이 필요한 경우도 많고 각각의 장단점은 비교적 명확하다. 그리고 정말 강한 문법 규칙을 적용하려면 HTML5 스펙에 표시된 것과 같이 XHTML5를 사용하면 된다. 이렇게 만들어진 HTML이기도 하고 XML이기도 한 문서를 다중언어 마크업이라고 한다. 아직 초안이지만 특징을 살펴보았다.

문서가 업데이트 되면서 잘못된 내용들이 수정되고 있습니다. 수정하는데 도움을 주신 wystan님과 겨미겨미님께 감사드립니다.

  • XML로도 해석 될 수 있는 HTML 문서를 다중언어 마크업(polyglot makup)이라고 부른다. HTML5에서 규정한 XHTML5 같은 문서가 이에 해당한다.

  • 처리 지시문(Processing Instructions)과 XML 선언(XML Declaration)은 다중언어 마크업에서 사용할 수 없다.

  • HTML, XML 양쪽에서 모두 지원 가능한 인코딩인 UTF-8을 사용한다 HTML은 명시적으로 인코딩을 UTF-8로 선언해야 한다. XML은 UTF-8이 기본 인코딩이기 때문에 선언되지 않을 수 있다. 문서 내부에서는 BOM이나 <meta charset="UTF-8">로 선언한다. 문서 외부에서는 아래와 같이 HTTP 헤더에 "charset=utf-8"을 추가한다.

    HTML: Content-type: text/html; charset=utf-8 
    XML: Content-type: application/xhtml+xml; charset=utf-8

  • 문서형 선언(DOCTYPE)은 반드시 선언되어야 하고 HTML5의 문서형 선언과는 약간 다르게 대소문자를 구별하기 때문에 주의해야 한다. HTML4, HTML3, HTML2 문서는 XHTML과 호환되지 않기 때문에 이 문서형 선언들은 사용할 수 없다.

  • HTML5에서는 html, svg, math, XLink의 네임스페이스(namespace)를 명시적으로 선언하지 않아도 기본값으로 인식이 되지만 다중언어 마크업에서는 XML과의 호환을 위해서 명시해 주어야 한다.

  • html, head, title, body 요소가 반드시 포함되어야 한다.

  • 다중언어 마크업에서는 tr의 상위 요소로 tbody 요소를 명시해 주어야 한다. 마찬가지로 col 요소에 대해서도 상위의 colgroup 요소를 명시해야 한다. HTML 파서는 tbody나 colgroup 요소를 자동으로 생성해 주는데 반해 XML 파서는 이런 동작을 하지 않기 때문에 DOM 트리를 유지하기 위해서는 이런 요소들을 표시해 주어야 한다. 또한 XML에서 사용할 수 없는 noscript 요소는 사용하지 않아야 한다.

  • 요소 이름(element name)이나 속성(attribute), 속성 값(attribute value)은 명시된 특별한 경우를 제외하고는 모두 소문자로 표기한다. HTML과는 달리 XHTML은 대소문자를 구분하기 때문이다.

  • img나 input과 같이 빈 요소를 사용할 수 있는 요소들이 정해져있다. 또한 br 요소의 경우 XML에서는 <br></br>과 같은 표기도 문제가 없지만 현존하는 유저 에이전트(user agent)에서 오동작이 발생할 수 있기 때문에 축약형 구문인 <br/>을 사용한다.

  • textarea 요소와 pre 요소의 내용은 공백문자(white space)로 시작할 수 없다.

  • CDATA 속성 안에 탭이나 줄 바꿈, 캐리지 리턴 문자를 포함할 수 없다. 모든 속성 값은 홑 따옴표나 겹 따옴표로 감싸져야 한다.

  • HTML5 규격에서 text/html 문서에 대해 xml:space, xml:base 속성을 유효하지 않게 정의했기 때문에 이들을 사용할 수 없다.

  • 문서의 언어는 lang 속성과 xml:lang 속성 둘다 사용해서 표기해야 하며 같은 값을 지정해야 한다.

  • XML의 속성-값 정규화를 위해 속성값에 포함된 탭, 라인 피드, 캐리지 리턴을 리터럴 문자 대신 16진 표기 등 숫자형 문자 레퍼런스를 사용한다. 예를 들어서 탭은 \t 대신 &#x9;로 사용 한다.

  • 지정된 HTML 엔터티(entity) 값으로 amp, lt, gt, apos, quot 만 사용할 수 있다. 예를 들어서 &nbsp;를 사용해야 할 때에는 대신 &#xA0;를 사용 한다. 10진 표기 보다는 16진 표기를 권장한다.

  • 스크립트나 스타일은 인라인으로 선언하지 말고 외부 파일을 사용해야 한다. 하지만 XML에서 사용하는 방식으로 외부 스타일 시트를 연결해서는 안 된다.

  • document.write()와 document.writeln()은 XHTML에서 사용할 수 없기 때문에 다중언어 마크업에서도 사용할 수 없다. 이 메서드 대신 innerHTML을 사용할 수 있다. XML 파서와 HTML 파서는 넘겨진 문자열을 각각 다르게 파싱할 수 있으므로 결과 값이 달라질 수 있다는 것을 주의해야 한다.

  • 스크립트나 스타일이 <, &, ]]>, -- 문자를 사용할 때에는 외부 파일을 사용해야 한다. XML 파서는 주석 구문을 삭제하고 처리해도 무방하기 때문에 스크립트나 스타일을 HTML 주석구문으로 감추는 방법은 XML 기반의 유저 에이전트에서는 오동작 할 수 있다.

  • 다중언어 마크업 문서의 안에서 스크립트나 스타일을 써야 할 경우에는 <, & 문자를 포함하지 않는 경우 사용할 수 있다.

  • 주석을 사용할 때는 >, -> 문자로 시작해서는 안 된다.

Comments

  • hiphapis 2010-12-28

    엇? 기존의 XHTML 1.x 사용하는거 아닌가요?

  • 신현석 2010-12-28

    용도나 목적에 맞게 선택해서 사용하면 되죠.

  • hiphapis 2010-12-28

    "HTML5에서 쓰는 XHTML은 1.x 아닌가요?" 라는 질문이었는데.. 제가 멍청한 질문을 했었네요. ㅎㅎ HTML5 + XML을 XHTML5라고 하는군요! 너무 오래 떠나있었나봐요. 흙;

  • 신현석 2011-01-05

    wystan님이 BOM관련된 오류를 지적해 주셔서 2011년 1월 1일자 에디터 초안의 내용으로 수정하였습니다. 감사합니다.

  • 이상한 2011-03-31

    신현식님의 글 잘 읽었습니다. 도움이 많이 되네요. 궁금한게 있어서요. html5가 문법의 관대하다고 하는데 홀태그인 경우 <img /> 닫아야 하나요? 아님 <img> 사용이 가능한가요? 하나더 궁금한게 다국어 확산시 <html lang=""> 속성을 언어코드에 맞게 꼭 기입해야 하나요? 글을 읽다 갑자기 생각나서 질문남기고 갑니다.

  • 신현석 2011-04-01

    HTML5에서는 닫는 표시를 하지 않아도 됩니다. <img>로 사용하실 수 있습니다. lang은 명시하는게 좋습니다. 하나의 문서에 여러개의 언어가 존재할 때에도 각각의 태그에 lang을 나타낼 수 있습니다.

  • 이상한 2011-04-01

    친절한 답변감사합니다. 앞으로도 좋은 글 부탁드립니다.

  • 신현석 2011-04-07

    겨미겨미님이 2011년 3월 18일자 초안 내용을 보내주셔서 업데이트 하였습니다.

  • 비선형 2014-04-07

    XHTML을 여지껏 사용하다가 HTML5에 좀 익숙해지려던 찰나 XHTML5의 존재를 알게된 후 (너무 늦게 알았나요? ^^;) 급 피곤해짐을 느낍니다 ㅠㅠ 가끔 웹은 양파같아요 .. 알면 알수록 더 무한한 세계로 빠져드는 블랙홀 @_@

Post a comment

:

: 공개 되지 않습니다. Gravatar를 표시 합니다.

:

: HTML 태그를 사용할 수 없습니다.