결합 문자
덤프버전 :
분류
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'에 결합한 것처럼 보이기 십상이다. 위의 'が'의 예에서도 か가 아니라 괄호에 탁음이 결합한 것처럼 보인다.
환경에 따라 입력이 어렵다는 것도 단점이다. 어떤 곳에서는 붙여넣었을 때 선행 문자에 잘 결합하지만 어떤 곳에서는 결합하지 않는다. 특히나 모바일에서는 별도의 앱을 동원하지 않는 이상 아직까지 쉽게 입력하기 어렵다.
문자열을 일정 길이로 잘라낼 필요성이 있는 경우 더 큰 문제가 생긴다. 결합 문자가 포함된 문자열을 잘라내는 과정에서 자릿수 상한에 걸릴 경우 결합 문자가 날아가버리기 때문. 그래서 결합 문자까지 고려해야 하는 별도의 문자열 자르기 알고리즘을 고안해야 한다.
5. 유사 개념[편집]
전산 출력상의 합자인 결합 문자와는 달리 코드상의 합자도 있다. 예컨대 ij(U+0133)는 'i'와 'j'를 하나의 코드로 합친 코드상의 합자이며, 모든 완성형 한글 음절자는 코드상의 합자이다.
첫가끝 방식(조합형)의 한글/자모나 옛한글/자모도 결합 문자의 일종으로 볼 수 있다. * 뒤에 종성 ퟣ와 같은 것을 같이 붙여놓는 경우 ퟣ가 * 밑을 찾아가 들어가는 것을 볼 수 있다.[15] 그러나 한글 자모는 워낙에 특수해서 보통 결합 문자로 보지는 않는다. 한글은 모음이 아래에 오는지 오른쪽에 오는지에 따라 자음의 모양이 달라져야 하기 때문에 위에서 다룬 결합 문자와는 또 다른 처리 과정이 필요하다.
6. 참고 문서[편집]
이 문서의 내용 중 전체 또는 일부는 2023-11-11 16:33:31에 나무위키 결합 문자 문서에서 가져왔습니다.
[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] 호환용 자모는 애초에 합자용이 아니기 때문에 이 현상이 일어나지 않는다.