다국어 형태 인코딩

질문

여러 언어와 스크립트가 사용될 수 있는 양식의 인코딩 문제를 다루는 가장 좋은 방법은 무엇일까요?

답변

(X)HTML 양식의 인코딩 문제를 다루는 최상의 방법은 모든 페이지를 UTF-8 형식으로 제공하는 것입니다. UTF-8은 가장 폭넓은 언어의 문자를 표현할 수 있습니다. 브라우저는 양식을 포함하는 페이지와 동일한 인코딩으로 양식 데이터를 전송하기 때문에 사용자는 필요한 언어와 스크립트가 무엇인지에 관계 없이 데이터를 입력할 수 있습니다.

이 방법을 적용하려면 몇 가지 세부적인 주의가 필요합니다. 첫째, 양식 페이지가 UTF-8 형식으로 되어 있다는 사실을 브라우저가 인식할 수 있게 해야 합니다. 페이지의 인코딩 방식을 브라우저에 알리는 방법은 여러 가지가 있습니다. 이렇게 브러우저가 인코딩 방식을 인식하는 것은 어떤 경우에도 중요하지만, 양식 페이지 자체가 US-ASCII 이외 문자를 포함하지 않지만 사용자가 다른 문자를 입력할 수도 있는 경우에는 특히 더 중요합니다.

둘째, 양식 데이터를 수신하는 스크립트가 실제 반환된 데이터가 UTF-8을 사용하는지 확인하는 것이 바람직합니다(잘못된 경우 사용자가 인코딩 변경). UTF-8은 다른 인코딩에는 나타나지 않는 매우 특별한 바이트 패턴을 갖기 때문에 이러한 확인이 가능합니다. 비UTF-8 데이터가 수신되면 오류 메시지를 전송해야 합니다.

한 예로, Perl에서 UTF-8에 대한 정규 표현식 테스트는 다음과 유사할 수 있습니다.

$field =~
  /\A(
     [\x00-\x7F]            # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*\z/x;

이 표현식을 다른 프로그래밍 언어에 채택할 수 있습니다. 이 표현식은 너무 긴 인코딩이나 대리자의 잘못된 사용 같은 다양한 문제를 처리합니다. $field가 UTF-8이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

The above regular expression can be tailored by adding application-related restrictions. As an example, many control characters can be excluded by replacing [\x00-\x7F] with [\x09\x0A\x0D\x20-\x7E]