나루가 내부적으로 소스 코드를 유니코드로 처리하기 때문에 이전에 이것 저것 뒤져 보면서 관련 자료를 찾아 봤습니다. 처음 언어를 만드시는 분들께 도움이 되었으면 합니다. (다른 자료도 있으면 알려 주세요. :)
- 유니코드에 대해서 아예 모르시겠다면 위키백과를 보시고 기본적인 내용을 알아 보세요.
- 유니코드를 바이트의 연속으로 표현할 때 사용하는 인코딩은 보통 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 같은 언어들도 참고해 보세요.
오, 좋은 자료!
왠진 모르겠는데 스팸이 “오, 좋은 사이트!” 하고 남기는 것 같은 기분이 들어요. orz
ㅋㅋㅋㅋㅋ
정리감사드립니다. 이기회에 다시 한번 uft 대해 보게됬습니다/ uft-16 이상을 사용할땐 리눅스와 윈도우에 대한 신경을 써야합니다. 자신의 언어가 windows 용으로 설계됬다면 리틀인디언 인코딩은 반드시 지원해야 합니다.
오, 좋은 사이트! 이런 사이트만큼 좋은 한달에 500만원 벌기!! 단 한번의 기회로 10만원 이상을 획득할수 있습니다. http://lengdeb.net
유니코드는 문자 집합이고, UTF-8, UTF-16 같은 인코딩은 유니코드를 바이트열로 표현(맵핑)하는 방식이라는 것은 다들 알고 계시겠죠?
왜 이리 유니코드 표준만 많냐… 라고 생각하시는 분을 위해 첨언.
유니코드에 대해서 아시는 분은 유니코드와 같은 내용의 국제 표준 ISO/IEC 10646이 존재한다는 걸 아실 겁니다. 근데 왜 유니코드가 따로 있느냐 하면, 국제 표준은 코드 포인트만 정의하지만 유니코드는 알고리즘도 다 정의하거든요. 그래서 우리가 필요로 하는 건 유니코드 표준에 거의 다 포함되어 있다고 봐도 과언이 아니고, 실제로 (영어만 해석이 잘 되면) 표준도 잘 쓰여 있는 편입니다. euc-kr 같은 문자 인코딩을 구현하는 게 아닌 이상(근데 이것도 유니코드 사이트에 데이터베이스가 있음 …) 유니코드에 대한 자료는 유니코드 문서만 참고해도 충분합니다.
위키에 베껴놨습니다.