태국어에서 한 문자 단위로 알 수 있는 방법은 무었입니까?

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

태국어에서 한 문자 단위로 알 수 있는 방법은 무었입니까?

Post by 비회원 »

안녕하세요. 오래전부터 gpgstudy 사이트를 보며 유용한 정보를 얻었습니다. 유용한 정보를 주신 분들에게 정말 감사드립니다. ^^

이번에 제가 참여하고 있는 게임의 태국 로컬라이즈 관련 담당을 맡았습니다.
IME는 Jupet 님의 훌륭한 소스를 잘 활용하고 있습니다만 태국어 font로 texture를 생성하는 과정에서 문제가 생겼습니다.

여기저기 인터넷에서도 찾아 봤으며 gpgstudy에서 태국어 관련 모든 항목을 읽어보고 이것저것 시도해 보다 안되서 이렇게 질문을 올립니다.

문제는 태국어 텍스트안(char *) 에 lead byte(base character)와 trail byte(top, above, below character) 를 구분할 수 있는 방법은 무엇입니까?

_ismbslead 함수를 써서 현재 char가 lead char와 trail char을 구분하려고 했지만 소용없었습니다.

태국어로 코드 페이지를 설정하고 CharNextExA를 써봐도 한글처럼 하나의 문자 단위로 포인터가 이동하지 않으며 태국어는 하나의 바이트 단위로 이동하더군요.
gpgstudy에는 이걸 사용하면 된다고 했지만 소용없었습니다.
혹시 태국어가 완성형이 아닌 조합형이기 때문은 문제가 되는건 아닌가요?

MultiByteToWideChar 함수로 변환해 봤지만 한글처럼 wchar 하나로 변환되지 않고 n개의 유니코드(wchar)로 나옵니다. 이건 조합형이기 때문에 발생하는 문제로 알고 있습니다.

게임에서 실시간으로 현재 사용중인 태국어 font 이미지를 생성해야 합니다.
과연 어떻게 하면 한 글자 단위로 추출하기 위해 lead char와 trail char를 구분할 수 있는 방법이 필요합니다.
또는 이를 지원하는 c 런타임 함수나 API가 존재하는지 알고 싶다.

태국 로컬라이즈 경험이 있으신분들중 알고 계시면 답변바랍니다. 감사합니다... ^^
zupet
Posts: 2764
Joined: 2003-05-13 03:34
Location: NCSOFT LE팀

Re: 태국어에서 한 문자 단위로 알 수 있는 방법은 무었입니까?

Post by zupet »

비회원 wrote:태국어로 코드 페이지를 설정하고 CharNextExA를 써봐도 한글처럼 하나의 문자 단위로 포인터가 이동하지 않으며 태국어는 하나의 바이트 단위로 이동하더군요.
gpgstudy에는 이걸 사용하면 된다고 했지만 소용없었습니다.
혹시 태국어가 완성형이 아닌 조합형이기 때문은 문제가 되는건 아닌가요?
태국어는 한글과 같은 조합형 글자를 쓰고 있는데 조합 단위 1개가 1바이트씩을 써서 1~4바이트까지 시용하는 Multi-Byte Character System 을 쓰고 있습니다. 그런데 태국어를 잘 조사해보면 이러한 조합들에는 한글 코드와 같이 규칙이 있고 좀더 열심히 조사하면 태국어 오토마타까지 만들 수 있습니다. (한글보다 쉽습니다.)

http://dexgame.com/zbxe/?mid=download&document_srl=7950

그래서 위 GPG Study 자료실 링크는 CharNextExA() 대체품으로 제가 만든 const char* CharNextTh(const char* lpsz) 라는 함수가 포함된 소스입니다. 이 소스가 2004년도 것인데 이 이후에 몇번 수정이 있었던 것 같기도 하고 아닌것 같기도 한데 일단 상용 소스들에 몇번 복사해서 들어간 녀석입니다. 그 이후의 개선사항이나 버그 픽스가 있었던것 같은데 기억이 가물가물해서 좀 미묘하군요.

그래도 이정도면 상당히 도움이 될겁니다. (도움 된다고 해주세요~ 해주세요~ 그러고보니 IME 테스트 코드에도 이거 안들어있네요. -_-a)
baek2187
Posts: 2
Joined: 2008-07-30 19:16

Post by baek2187 »

위에 질문한 사람입니다.
이렇게 빨리 답변을 달아 주시니 정말 감사합니다.

소스를 코드를 분석중인데 제게 큰 도움이 될거 같습니다.

그런데 혹시 개인 코드말고 API나 런타임 라이브러리에서 제공하는 태국어가 반영되는 공식적인 함수는 없는 건가요?
또 궁금한 것이 태국 현지 프로그래머들도 자국어(태국) 프로그래밍 할때 문자 단위 사용할때 윈도우 공식 API 없이 zupet님 처럼 현지 라이브러리나 개인 코드를 사용하나요?

어쨋든 제겐 큰 힌트가 될거 같습니다..감사합니다. ^^
zupet
Posts: 2764
Joined: 2003-05-13 03:34
Location: NCSOFT LE팀

Post by zupet »

baek2187 wrote:위에 질문한 사람입니다.
이렇게 빨리 답변을 달아 주시니 정말 감사합니다.

소스를 코드를 분석중인데 제게 큰 도움이 될거 같습니다.

그런데 혹시 개인 코드말고 API나 런타임 라이브러리에서 제공하는 태국어가 반영되는 공식적인 함수는 없는 건가요?
또 궁금한 것이 태국 현지 프로그래머들도 자국어(태국) 프로그래밍 할때 문자 단위 사용할때 윈도우 공식 API 없이 zupet님 처럼 현지 라이브러리나 개인 코드를 사용하나요?

어쨋든 제겐 큰 힌트가 될거 같습니다..감사합니다. ^^
baek2187님이 제게 물어보는 이유가 아마 제가 저런 코드를 직접 만들었던 이유와 같을 겁니다. 퍼블리셔에게 물어보면 '몰라' 라는 답만 돌아왔으니까요. 제가 직접 컨택했던 업체는 전혀 도움을 주지 않았고 나중에 Word Breaker 라이브러리 하나 덜렁 구해준 것 말고는 프로그래밍상 도움을 받은 적이 없습니다. 그리고 위의 CharNextExA() 문제는 그냥 화면에 잘 찍어주고 커서만 움직이면 문제를 삼지 않기 때문에 구현에 대한 불평은 없었습니다.

태국어를 쓸때는 Word Breaker 쪽이 더 문제죠. 태국어는 일본어 같이 띄어쓰기가 없이 문자를 붙여 쓰는데 한글이나 일본어와 달리 단어를 구성하는 문자 수가 영어만큼 많고 단어 중간이 짤릴 경우 전혀 다른 뜻으로 해석이 되기도 합니다. 그래서 Word Breaker 를 잘 써야하는데 제 경우 퍼블리셔가 구해준 받은 사전 데이터를 사용한 라이브러리를 써서 단어를 쪼개 썼었습니다. 경우에 따라 조사등을 조사해서 단어 끝을 감지하는 방법등도 있다지만 사전 데이터를 사용하는 방식이 정확도가 더 높다고 합니다. Word Breaker 쪽은 미리미리 챙겨두지 않으면 출시전에 태클을 받을 수 있으니 지금 사용하시는 방법이 문제가 없는지 미리 확인을 받아두시기 바랍니다.
oranke
Posts: 244
Joined: 2002-05-09 09:00

Post by oranke »

아는 분이 비슷한 내용의 질문을 주셔서 삽질 중 입니다.
저 역시 유니코드는 2바이트다 라고 간주하고 작업 해 왔기 때문에 이번 기회에 관련 코드를 정돈하는
계기가 될 것 같아서 말이죠...

태국어를 전혀 모르니, 태국 관광청 사이트에 가서 다음 내용을 복사 해 워드패드에 붙여 보았습니다.

เข้าหน้าสู่หน้าหลัก

컨트롤 + 화살표 키를 써서 다음 단어들로 쪼갤 수 있더군요.

เข้า, หน้า, สู่, หน้า, หลัก

각 단어별로 온라인 태국어 사전으로 검색되는 것을 보니 대충 잘 잘라진 것 같은데...
(사실 잘 모르겠습니다만... ㅠㅠ)
(위에서 언급된 것 처럼 표시되는 건 13개인데 실제로는 19개군요. 신기한 세상~~ :wink: )

아무튼 신기한 건, 별다른 설정을 하지 않아도 적어도 "리치에디트" 컨트롤을 비롯한 표준 윈도 컨트롤에서는
제대로 '워드랩'이 이루어지고 컨트롤 + 화살표로 단어 단위 이동이 가능한 것 처럼 보인다는 사실입니다.

MSDN을 뒤벼보니 EM_FINDWORDBREAK 란 메시지가 있고 wParam에 WB_MOVEWORDLEFT, 또는
WB_MOVEWORDRIGHT를 던지면 한 단어의 범위를 얻을 수 있더군요.
게다가 화살표 키로 커서를 이동하면 조합된 문자도 알아서 건너뛰어주니 일석이조입죠.

(물론 제대로 동작하고 있다는 가정 하에...)
이 리치에디트의 기능을 뽑아서 사용할 좋은 방법은 뭐 없을까 고민이 되네요. ^^
Last edited by oranke on 2008-08-14 18:21, edited 1 time in total.
oranke
Posts: 244
Joined: 2002-05-09 09:00

Post by oranke »

일단, 파이어폭스, 델파이, 노트패드++ 등 소위 "싸제 에디터"에서는 이 기능이 동작하지 않는군요.
(당연히 저희 게임에서도 안됩니다. :D )

혹시나 싶어 우분투의 gedit에서 동일한 내용을 붙여넣고 컨트롤 + 화살표를 눌러보니
윈도와 동일하게 워드브레이킹이 돌아가네요.
한글 폰트만 올린 상태이고 태국어와 관련된 아무런 작업도 하지 않았습니다.

Image

와인에서도 해 보려 했지만, 태국어 환경 설정이 힘들어 일단 포기했네요. 쩝...

관련된 내용인지는 모르겠지만, 그놈의 TextAPI는 워드브레이킹을 지원 해 주나봅니다.
traffic 을 뽀개서 "traf-" 와 "fic" 으로 만들어준다는 내용도 있는데... 뭐 경험이 없으니...

http://www.levien.com/gnome/gnome-text.html

아무튼 윈도에서도 숨겨두지는 않았을텐데... 도대체 어디서 찾아야 할까요... :-? :-?
trackback:

트랙백

Post by trackback: »

삽질하는플머: 기존 게임용 문자 상자 (TextBox) 구현 유니스크라이브 삽질에 비해 상대적으로 쉬워보이는 문자열 출력도 이것 저것 신경쓰려다 보니 계속 할 일이 생긴다. 모든 일이 다 그렇지만... 제대로 하려고 마음 먹으면 끝이 없는듯 하다. 게임에서 NPC 대화상자등을 만들 경우도 쉽게 하려면 화면너비 기준으로 일일이 잘라넣으면 되지만, UI 가 변경되거나 할 경우 다시 수정해야 하는 번거로움이 있다. 때문에 적절한 워드랩을 지원해주면 로컬라이징 작업이 많이 행복해진다. 유니스크라이브의 ScriptBr..
Locked