LangDev

프로그래밍 언어 개발에 관심 있는 사람들의 모임입니다.


유니코드를 지원하는 언어를 만들려면

2008-08-13 10:29:41

나루가 내부적으로 소스 코드를 유니코드로 처리하기 때문에 이전에 이것 저것 뒤져 보면서 관련 자료를 찾아 봤습니다. 처음 언어를 만드시는 분들께 도움이 되었으면 합니다. (다른 자료도 있으면 알려 주세요. :)

  • 유니코드에 대해서 아예 모르시겠다면 위키백과를 보시고 기본적인 내용을 알아 보세요.
  • 유니코드를 바이트의 연속으로 표현할 때 사용하는 인코딩은 보통 UTF-8이 많이 쓰입니다. (UTF-16, UTF-32는 딱히 인코딩이라고 할 게 없지만…) 역시 위키백과에 좋은 표가 있습니다.
  • 유니코드의 각 문자들에 대한 자료는 유니코드 문자 데이터베이스(UCD)에 있습니다. 몇 가지 힌트를 드리면,
    • UnicodeData.txt에 수록된 내용은 꼭 이해하고 넘어 가시는 게 좋습니다. UAX #31 등의 구현에 필요합니다.
    • 문자열을 소문자로 바꾸거나 대문자로 바꾸거나 하는 작업은 CaseFolding.txt 등을 참고하시길 바랍니다. 유니코드 책 4장(아마도)에 관련 알고리즘도 쓰여 있을 겁니다.
  • 유니코드 표준 중에 UAX #31은 식별자(identifier)에 사용될 수 있는 문자와 문법에 사용될 수 있는 문자에 대해서 설명하고 있습니다. 쉽게 말하면 ID_Start로 시작하고 ID_Continue가 뒤에 붙는 문자열은 모두 식별자로 처리한다면 되는 소린데, 이들 집합을 UCD에서 정의하기 때문에 위에서 UCD를 이해하라고 한 겁니다. ;)
  • 하나의 문자열이 유니코드에서 여러 가지 형태로 표현될 수 있습니다. 이런 형태를 하나의 형태로 정규화해 주는 알고리즘이 유니코드 표준에 있는데, UAX #15를 참고하시면 되겠습니다. 흔히 NFC, NFD, NFKC, NFKD라고 하는 것들이 정규화 알고리즘입니다.

여기까지가 일반 언어에 관련된 것이고, 국제화(i18n) 및 지역화(l10n)를 신경쓰고 싶으시다거나 기타 등등을 원하신다면 이것도 읽어 보시길 권합니다.

  • 유니코드를 지원하는 정규식을 표준 라이브러리에 넣으신다면 UTS #18을 참고하세요. 다만 내용이 꽤나 방대하다는 게 문제인데, 특히 level 3 support 부분은 상당히 손이 많이 갈 것 같습니다. 적절히 필요한 만큼만 구현하면 될 듯.
  • 문자열을 단순히 코드포인트 순서대로 비교하지 않는다면 collation을 신경써야 겠죠. UTS #10이 많은 도움이 될 것입니다. 다만 모든 collation 알고리즘은 어떤 형태로든 collation data가 있어야 한다는 점이 문제네요. (저는 구현 안 하려고 합니다.)
  • 수학과 밀접하게 연관되는 언어를 원하신다면 UTR #25에 수학과 관련된 유니코드 지원에 대한 내용이 쓰여 있습니다. Fortress 같은 언어들도 참고해 보세요.

트랙백 주소: http://langdev.net/post/trackback/138

  1. 홍민희 2008-08-13 10:35:14

    오, 좋은 자료!

  2. lifthrasiir 2008-08-13 10:36:44

    왠진 모르겠는데 스팸이 “오, 좋은 사이트!” 하고 남기는 것 같은 기분이 들어요. orz

  3. 홍민희 2008-08-13 10:37:55

    ㅋㅋㅋㅋㅋ

  4. 민군 2008-08-13 10:36:43

    정리감사드립니다. 이기회에 다시 한번 uft 대해 보게됬습니다/ uft-16 이상을 사용할땐 리눅스와 윈도우에 대한 신경을 써야합니다. 자신의 언어가 windows 용으로 설계됬다면 리틀인디언 인코딩은 반드시 지원해야 합니다.

  5. 민군 2008-08-13 10:37:55

    오, 좋은 사이트! 이런 사이트만큼 좋은 한달에 500만원 벌기!! 단 한번의 기회로 10만원 이상을 획득할수 있습니다. http://lengdeb.net

  6. 홍민희 2008-08-13 10:39:12

    유니코드는 문자 집합이고, UTF-8, UTF-16 같은 인코딩은 유니코드를 바이트열로 표현(맵핑)하는 방식이라는 것은 다들 알고 계시겠죠?

  7. lifthrasiir 2008-08-13 11:31:48

    왜 이리 유니코드 표준만 많냐… 라고 생각하시는 분을 위해 첨언.

    유니코드에 대해서 아시는 분은 유니코드와 같은 내용의 국제 표준 ISO/IEC 10646이 존재한다는 걸 아실 겁니다. 근데 왜 유니코드가 따로 있느냐 하면, 국제 표준은 코드 포인트만 정의하지만 유니코드는 알고리즘도 다 정의하거든요. 그래서 우리가 필요로 하는 건 유니코드 표준에 거의 다 포함되어 있다고 봐도 과언이 아니고, 실제로 (영어만 해석이 잘 되면) 표준도 잘 쓰여 있는 편입니다. euc-kr 같은 문자 인코딩을 구현하는 게 아닌 이상(근데 이것도 유니코드 사이트에 데이터베이스가 있음 …) 유니코드에 대한 자료는 유니코드 문서만 참고해도 충분합니다.

  8. 디토 2008-08-13 17:38:28

    위키에 베껴놨습니다.

목록보기

← 특정 도메인을 위해 언어를 수정해서 쓰는 것에 대해 어떻게 생각하세요? | 뭔가 seoula 로 만들던것 →