일반적인 글자의 합침에 대한 내용은 합자 문서 참고하십시오.
결합 문자임을 나타내는 점선 동그라미 (선행 문자가 없을 때 표시됨)[1][2] |
[clearfix]
1. 개요
결합 문자( 結 合 文 字, Combining Character)는 선행 문자에 표기상 결합할 수 있는 문자를 말한다. 활자가 등장한 이래[3] 대부분의 문자는 각자의 칸이 있어서 옆 칸을 침범하지 않지만[4], 결합 문자는 자신의 칸이 없이 선행 문자가 차지하고 있는 칸에 겹쳐서 표시된다. 전산 출력상의 합자로 볼 수 있다.해당 문자열이 결합 문자인지 하나의 코드인지는 텍스트 입력 상태에서 문자 뒤에 커서를 두고 백스페이스를 눌러보면 알 수 있다. 결합 문자인 경우 어디까지나 다른 코드이기 때문에 결합 문자 부분만 먼저 지워지고 선행 문자만이 남는다.[5] 코드를 확인할 수 있는 환경이라면 결합 문자에 해당하는 코드가 뒤에 붙어있으면 결합 문자이다. 블록 지정은 결합 문자 부분만은 불가능하고 전체만 지정할 수 있다.
2. 전산적 구현
유니코드에는 '조합 분음 기호(Combining Diacritical Marks)'에 주로 몰아서 실어두고 있다. 유니코드/0000~0FFF를 참고하면 주로 U+0300~0360번대에 실려있다. 단, 개별 문자체계에서 사용하는 몇몇 결합 문자들은 이 탭에 없고 여기저기 흩어져있다. 아래 소개할 탁점과 옛한글 방점은 U+3000번대에 실려있다.선행 문자와 결합 문자가 합쳐진 문자를 '결합된 문자(combined character)'라고 한다면, 반대로 '미리 합쳐진 문자(precomposed character)'[6]들도 있다. # 이 두 글자는 겉보기에는 비슷하게 생겼기 때문에 한쪽으로 맞춰주는 정규화(normalization) 과정이 필요하다. # 한글 역시 미리 합쳐진 것과 결합된 문자 방식이 공존하기에 현대 한글 NFC ↔ NFD 변환 테이블과 같은 정규화 과정이 필요하다. macOS와 Windows의 정규화 과정이 다르기 때문에 한글이 다 박살나는 현상은 유명하다. 자세한 것은 유니코드 정규화 참고.
3. 용도
부호를 출력하는 데 자주 활용된다. 단, 부호라고 다 결합 문자로 구성된 것은 아니고 'ä'(\U+00e4)와 같이 코드상 합자로 구현된 것들도 많다. 한편 'ɒ̈'(U+0252 U+0308) 같이 빈도가 낮은 것은 결합 문자로 되어있다. 라틴 문자는 수가 적어서 'ǘ'(U+01D8)[7]과 같이 부호 두 개가 겹쳐있는 것까지도 하나의 코드로 실려있는 것이 있다.IPA에서는 음성 자질을 부호로 자주 나타내는데, 몇 개의 부호만을 쓰는 일반 언어와는 달리 부호를 매우 다양하게 사용하기 때문에 이들을 모두 하나의 코드로 만들 순 없고 결합 문자를 많이 쓴다(p̪, b̪[8] 등). 또한 파찰음의 경우 이음선이라는 (위쪽을 주로 쓰나 아래에도 씀) 결합 문자를 써서 이어주도록 되어있다(t͡s, t͜s).[9] 그러나 'p̪'는 'p'로 쓰면 완전히 다른 음소가 되지만, 't͜s'는 'ts'라고 써도 [t]-[s] 연쇄가 비교적 드물기 때문인지 (엄밀히는 틀린 표기이나) 그냥 'ts'로 쓰는 경우도 많다. 사실 아래에서 다루듯 결합 문자를 입력하기 어려운 상황이 많은 영향도 크겠다.
옛한글에서 방점도 결합 문자로 구현되어있다(〮, 〯, U+302E, U+302F). 다만 입력 자료에서는 그냥 ·( 가운뎃점)과 :( 쌍점)으로 따로 입력한 것들이 많다. 옛한글이 보이지 않는 환경에서 방점이 없는 상태에서는 그나마 자모가 풀어져서라도 출력이 되곤 하지만, 방점을 결합시켜두면 아예 통째로 안 보일 때가 많은 것도 한 이유이다. 후술하겠지만 옛한글 및 조합형 자체가 결합 문자의 일종으로 볼 여지가 있다.
일본 가나 탁점(◌゙, U+3099)과 반탁점(◌゚, U+309A)은 결합 문자로도 구현되어 있다. 그러나 번거로운 데다가 글자 수가 적은 가나 특성상 어차피 몇십 자만 더 추가하면 되는 일이라 잘 쓰이진 않는다. 이를 이용하면 본래 탁점/반탁점이 붙지 않는 글자에도 탁점/반탁점을 붙일 수 있다는 장점은 있다.[10]
결합 문자로 입력한 か゚의 예 |
결합 문자로 입력한 が와 개별 코드 が. 결합 문자 が의 탁점은 괄호와 겹쳐져보이는 문제가 있다. |
반각 가타카나는 1바이트 내에 넣는 것을 목표로 했기 때문에 탁점과 반탁점이 무조건 결합 문자 방식으로 구현된다(゙, ゚).[11]
구결을 한자 주변의 점과 선으로 나타낸 점토구결(點-)도 결합 문자로 나타내면 실제 문헌에서 겹쳐있는 모양새를 더 잘 구현할 수 있으리라는 의견이 있다. 물론 자토구결(字-)부터가 유니코드에 실려있지 않은 시점이라(2019년 기준) 점토구결도 당연히 구현은 되어있지 않다.
태국 문자의 성조 기호는 텍스트 상단으로 쌓여나가는 식의 결합 문자인데 이를 이용해 스프링 도배를 할 수 있다. 영어로는 이를 'Zalgo text'라고 한다.
4. 불편함
마치 손글씨를 쓰듯 문자 위에 문자를 올려놓을 수 있다는 점에서 유용한 기능이지만 쓰다 보면 자잘한 문제가 꽤 있다. 우선 복붙했을 때 결합 문자만 다른 데로 가버리는 경우가 상당하다. 또한 결합 문자를 붙여넣어도 원하는 문자 위에 붙지 않고 다른 데 가서 붙는 일도 꽤 많은 편. 아래아 한글이 유난히 결합 문자 관련해서 좀 이상하게 작동하는 편이다.[12]부수적인 문제로는 어디까지나 기계적으로 겹치는 것이기 때문에 자형상 자연스러운 곳에 붙기 어렵다. 예컨대 결합 문자로도 구현되어있는 탁점의 경우에도 'で'의 탁점의 위치와 'が'의 탁점의 위치는 다르다. 'て'의 자형상 획이 오른쪽 위 끝까지 뻗어있기 때문에 탁점의 위치가 내려간 것이다.[13] 결합 문자의 알고리즘으로는 이를 감안하기는 어렵다. 선행 문자가 자리를 많이 차지하는 문자일 경우 결합 문자와 선행 문자의 획이 겹쳐서 잘 보이지 않을 수도 있고, 선행 문자의 모양새에 따라 결합 문자가 영 이상한 위치에 붙어버릴 수도 있다. 특히 이음선(tie, ⁀ )과 같이 두 글자 사이에 오는 결합 문자는 딱 어울리는 위치에 오기가 더욱 어렵다.[14] 이런 문제는 'i'나 ')'와 같이 폭이 좁은 문자에서 더 심각하다. 'D' 같이 폭이 넓은 글자에서는 좀 이상한 데 붙는 정도지만 'iD' 같은 문자열에서 i에서 먼 데에 붙어버리면 'i'가 아니라 'D'에 결합한 것처럼 보이기 십상이다. 위의 'が'의 예에서도 か가 아니라 괄호에 탁음이 결합한 것처럼 보인다.
정확하지 않은 위치에 온 이음선의 예(͜ts). 바른 표기는 t͜s이다. |
문자열을 일정 길이로 잘라낼 필요성이 있는 경우 더 큰 문제가 생긴다. 결합 문자가 포함된 문자열을 잘라내는 과정에서 자릿수 상한에 걸릴 경우 결합 문자가 날아가버리기 때문. 그래서 결합 문자까지 고려해야 하는 별도의 문자열 자르기 알고리즘을 고안해야 한다.
5. 유사 개념
전산 출력상의 합자인 결합 문자와는 달리 코드상의 합자도 있다. 예컨대 ij(U+0133)는 'i'와 'j'를 하나의 코드로 합친 코드상의 합자이며, 모든 완성형 한글 음절자는 코드상의 합자이다.첫가끝 방식( 조합형)의 한글/자모나 옛한글/자모도 결합 문자의 일종으로 볼 수 있다. * 뒤에 종성 ퟣ와 같은 것을 같이 붙여놓는 경우 ퟣ가 * 밑을 찾아가 들어가는 것을 볼 수 있다.[15] 그러나 한글 자모는 워낙에 특수해서 보통 결합 문자로 보지는 않는다. 한글은 모음이 아래에 오는지 오른쪽에 오는지에 따라 자음의 모양이 달라져야 하기 때문에 위에서 다룬 결합 문자와는 또 다른 처리 과정이 필요하다.
6. 참고 문서
[1]
해당 문자는
double acute이다.
[2]
위 폰트는 MS mincho(MS명조체)이다.
MS 워드에서
한글
돋움에 없는 문자는 대개 MS mincho로 바뀌기 때문이다. 폰트에 따라 점선 동그라미의 자형도 약간씩 다르다. 아래는
함초롬돋움의 점선 동그라미 자형이다.
[3] 손글씨나 통짜 판을 쓰는 경우에는 이러한 제약이 없다. [4] 'fi' 같은 문자열은 'i'의 점을 'f'의 획과 합친다든지 하는 조작이 일어나기도 한다. [5] 간혹 환경에 따라 통째로 다 지워지기도 한다. [6] 출력하기 이전에 코드상으로 이미 합쳐진 상태로 실려있다는 의미이다. [7] 한어병음에서 사용한다. 한어병음에서는 기본적으로 성조에 부호를 쓰고, 음소 표기로도 'ü'와 같은 부호를 쓰기 때문에 이 둘이 겹치게 된다. 'lǘ'로 읽는 한자로는 闾 등이 있다. [8] 아래 기호는 양순 파열음에 붙으면 순치 파열음을 나타낸다. [9] ts와 같이 위 첨자(superscript)로 쓰는 방법도 가능은 하다. 다만 파찰음을 위첨자로 쓰는 경우는 거의 없다. 위첨자는 βʷ와 같이 특정 조음이 붙는 표기에 사용되는 경우가 많다. [10] 아래와 같은 か행의 반탁점이 붙은 것은 비탁음을 표기하는 데 쓰이기도 한다. [11] 각각 U+FF9E, U+FF9F이다. [12] 일단 Google Noto 폰트가 그나마 잘 먹히는 편인데 한글 2014 기준 그리스 문자/키릴 문자+결합 문자는 그럭저럭 작동하지만 로마자+결합 문자는 맛이 가버리는 일이 빈번하다. 타 폰트에서 로마자+결합 문자는 그럭저럭 먹혀도 다른 문자와 합치면 결과가 이상해지는 경우와는 정반대. [13] 앞서 언급한 점토구결에서도 한자의 획 끝이 어디에 위치하느냐에 따라 점토의 위치가 달라진다. [14] 이러한 문제는 폰트 디자이너가 오픈타입 글꼴의 GSUB, GPOS 테이블에 조합 경우에 맞게 결합 문자의 위치 등을 지정해 줌으로써 해결할 수 있으나 프로그램의 폰트 렌더링 방식에 따라 GSUB, GPOS 기능이 정상 동작하지 않는 경우도 있어 해결되지 않는 경우도 있다. [15] 호환용 자모는 애초에 합자용이 아니기 때문에 이 현상이 일어나지 않는다.
[3] 손글씨나 통짜 판을 쓰는 경우에는 이러한 제약이 없다. [4] 'fi' 같은 문자열은 'i'의 점을 'f'의 획과 합친다든지 하는 조작이 일어나기도 한다. [5] 간혹 환경에 따라 통째로 다 지워지기도 한다. [6] 출력하기 이전에 코드상으로 이미 합쳐진 상태로 실려있다는 의미이다. [7] 한어병음에서 사용한다. 한어병음에서는 기본적으로 성조에 부호를 쓰고, 음소 표기로도 'ü'와 같은 부호를 쓰기 때문에 이 둘이 겹치게 된다. 'lǘ'로 읽는 한자로는 闾 등이 있다. [8] 아래 기호는 양순 파열음에 붙으면 순치 파열음을 나타낸다. [9] ts와 같이 위 첨자(superscript)로 쓰는 방법도 가능은 하다. 다만 파찰음을 위첨자로 쓰는 경우는 거의 없다. 위첨자는 βʷ와 같이 특정 조음이 붙는 표기에 사용되는 경우가 많다. [10] 아래와 같은 か행의 반탁점이 붙은 것은 비탁음을 표기하는 데 쓰이기도 한다. [11] 각각 U+FF9E, U+FF9F이다. [12] 일단 Google Noto 폰트가 그나마 잘 먹히는 편인데 한글 2014 기준 그리스 문자/키릴 문자+결합 문자는 그럭저럭 작동하지만 로마자+결합 문자는 맛이 가버리는 일이 빈번하다. 타 폰트에서 로마자+결합 문자는 그럭저럭 먹혀도 다른 문자와 합치면 결과가 이상해지는 경우와는 정반대. [13] 앞서 언급한 점토구결에서도 한자의 획 끝이 어디에 위치하느냐에 따라 점토의 위치가 달라진다. [14] 이러한 문제는 폰트 디자이너가 오픈타입 글꼴의 GSUB, GPOS 테이블에 조합 경우에 맞게 결합 문자의 위치 등을 지정해 줌으로써 해결할 수 있으나 프로그램의 폰트 렌더링 방식에 따라 GSUB, GPOS 기능이 정상 동작하지 않는 경우도 있어 해결되지 않는 경우도 있다. [15] 호환용 자모는 애초에 합자용이 아니기 때문에 이 현상이 일어나지 않는다.