KTUG마당은 KTUG를 방문하는 모든 이용자가 대화를 나누고 소식을 전하는 곳입니다.

  • 로그인 없이 자유롭게 글을 읽고 쓸 수 있는 철학은 처음과 같이 계속됩니다.
  • Team Blog의 글을 이곳 게시판의 "정보글"로 모았습니다. Team blog는 기고자가 올린 글에 질문을 받는 부담을 줄이기 위하여 댓글을 허용하지 않았습니다. 그러나 이곳 게시판으로 모으면서 댓글을 달 수 있습니다. 게시물을 작성하실 때 댓글을 원하지 않으시면 댓글을 허용하시지 않으시기를 바랍니다. 또한 불필요한 소모성 댓글을 달지 않도록 주의하여 주시기를 바랍니다.
  • TeX과 관련된 질문이나 답변은 QnA 마당을 이용하십시오. TeX과 관련된 질문은 지웁니다
  • MathJax를 이용한 수식조판을 사용하실 수 있습니다. 여기를 참조하세요.
  • 스팸 글을 막기 위하여 짧은 시간 내에 다시 글이 등록되는 IP를 막거나, 광고 글을 막기 위하여 금지어로 .com, .net 등을 설정하고 있습니다. 다소간의 불편함이 있으시더라도 양해 바랍니다.
    • 금지어에서 stackexchange, stackoverflow, ctan, overleaf, , github, google.com, gmail.com, .org, .io, sil.org, wiki.com, tistory.com등은 해제하였습니다.
  • 사용하는 편집기는 CKeditor입니다. 편집기에서 [enter]를 누르면 <p> 태그가 들어가고, 문단으로 생각하고 한줄을 비웁니다. 글줄만 바꾸려면 shift-enter 를 누르시면 <BR>가 들어가므로 용도에 맞게 나누어 쓸 수 있습니다.

자유글 Simplified Hangulize

2015.06.21 09:59

nanim 조회 수:3936 추천:1

한글 로마자 표기법 관련 게시물이 연재되는 중간에, "전자법"에 대한 얘기가 나왔습니다.

한 분께서 말씀하시기를, "한글 표기와 로마자 표기가 일대일 대응이 된다면, 로마자 전자법으로 표기된 것을 한글로 복원할 수 있지 않은가?"라고 하셨습니다. (당연하지만, 표준 로마자 표기법이나 MR방식에 의하여 표기된 것은 복원 불가능합니다.)

물론 가능합니다. 이미 hangulromanize 패키지에 다 구현되어 있고요.


그런데 그 강좌를 이왕 expl3로 하던 참이니, 그 연속선 상에서 어떻게 해볼 수 있겠는가 생각해봤습니다.

이를 위해 필요한 것은 다음과 같습니다.

  1. 로마자 입력의 초/중/종성을 분석해야 합니다. 현대 한글 음절과 달리 로마자화된 것은 초/중/종성 각각 가변길이 문자열이기 때문에 이를 parse해서 초/중/종성으로 나눈 다음 한글 자모 문자에 대응시켜야 하는 것입니다.
  2. 한글 자모로 된 변환 결과를 한글 음절 문자로 변환해야 합니다. (이것은 이미 준비되어 있습니다. 한글의 분해와 조립 참조)

expl3로 이 문제를 해결하려 할 때 1 부분의 구현 방법을 생각해봅니다. 입력되는 문자를 차례로 받아들여서 초성인가 판단하고 그 다음 문자를 읽어서 초성(중성이 아님)인가 판단하고, 다시 그 다음 문자를 읽어서 중성인가 판단하고, 또 그 다음 문자를 읽어서 중성이 끝났는지 판단하고 하면 초성과 중성의 판정은 그럭저럭 이루어집니다.

문제는 종성+초성 연결 부분인데, 이것은 모음(중성)의 끝과 다음 모음 사이의 문자들을 읽은 다음 음절 구분자(-)가 있으면 바로 처리하고 없으면 문자열의 성격을 분석하여(문자열의 길이를 취하여 분석하는 방법도 있습니다) 종성 부분과 초성 부분을 가려내면 될 것입니다.


이런 방법도 나쁘지 않고 꼬리재귀 등의 기법을 활용할 수 있을 것이기 때문에 expl3 언어 연습으로 좋다고 생각하지만, 발상을 조금 바꾸어서 이 문제를 해결해보려 합니다.

일단, 현대 한글의 초성 위치에 올 수 있는 자음은 단자음과 된소리 표기의 쌍자음뿐입니다. 그러므로 예를 들어 kk는 K, pp는 P하는 식으로 미리 변환해두고 초성은 무조건 한 글자만 되게 합니다. 어두가 모음으로 시작하면 강제로 -를 앞에 붙여서 -를 초성처럼 취급합니다.

중성 모음은 1자에서 3자까지 쓰이는데, 이것도 모두 한 글자로 표기하기로 합니다. 어차피 변환 목적이므로 로마자 표기에 쓰이지 않는 z, q, x 따위를 일종의 부호처럼 쓰고 대소문자를 구분하면 중성도 한 문자로 표현할 수 있습니다.

이렇게 해두면 일단 중성을 찾고 그 앞의 한 문자만 취하면 바로 초성과 중성을 변별할 수 있습니다. 종성은 좀더 복잡해서 도저히 한 글자로 표현할 수 없고 있다해도 번거로우므로, 초성/중성 변환하고 남은 것을 종성으로 취하여 변환해주자는 것입니다.


물론 이렇게 한다 해도, 주의할 것이 남기는 합니다. 예를 들어 '앉지'를 로마자로 표기한 anjji에서 njj를 nj-j로 미리 분해해두지 않으면 결과가 이상해지겠지요. jj는 J로 변환되어 한 글자가 되기로 되어 있기 때문에 nJ처럼 변환되어 안찌가 되면 안 되기 때문입니다.


첨부 파일은 이 발상으로 전자법으로 쓰인 로마자 문자열을 한글로 변환하는 것입니다.

소스가 길지 않아서 간단히 이해하고 적용할 수 있을 것으로 봅니다. 모든 경우를 다 고려하지 못했다고 생각하므로, 필요하면 추가/수정할 수 있게 해주십시오.





XE Login