유니코드를 지원하는 언어를 만들려면
lifthrasiir나루가 내부적으로 소스 코드를 유니코드로 처리하기 때문에 이전에 이것 저것 뒤져 보면서 관련 자료를 찾아 봤습니다. 처음 언어를 만드시는 분들께 도움이 되었으면 합니다. (다른 자료도 있으면 알려 주세요. :)
- 유니코드에 대해서 아예 모르시겠다면 위키백과를 보시고 기본적인 내용을 알아 보세요.
- 유니코드를 바이트의 연속으로 표현할 때 사용하는 인코딩은 보통 UTF-8이 많이 쓰입니다. (UTF-16, UTF-32는 딱히 인코딩이라고 할 게 없지만...) 역시 위키백과에 좋은 표가 있습니다.
- 유니코드의 각 문자들에 대한 자료는 유니코드 문자 데이터베이스(UCD)에 있습니다. 몇 가지 힌트를 드리면,
- UnicodeData.txt에 수록된 내용은 꼭 이해하고 넘어 가시는 게 좋습니다. UAX #31 등의 구현에 필요합니다.
- 문자열을 소문자로 바꾸거나 대문자로 바꾸거나 하는 작업은 CaseFolding.txt 등을 참고하시길 바랍니다. 유니코드 책 4장(아마도)에 관련 알고리즘도 쓰여 있을 겁니다.
- 유니코드 표준 중에 UAX #31은 식별자(identifier)에 사용될 수 있는 문자와 문법에 사용될 수 있는 문자에 대해서 설명하고 있습니다. 쉽게 말하면 IDStart로 시작하고 IDContinue가 뒤에 붙는 문자열은 모두 식별자로 처리한다면 되는 소린데, 이들 집합을 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 같은 문자 인코딩을 구현하는 게 아닌 이상(근데 이것도 유니코드 사이트에 데이터베이스가 있음 ...) 유니코드에 대한 자료는 유니코드 문서만 참고해도 충분합니다.
위키에 베껴놨습니다.