아랍어 조합 원리
문맥형(이솔레이션·초·중·종형), 결합 속성, RTL, composition
아랍어는 연결형(joining) 문자다. 글자 모양이 위치(단독·어두·어중·어말)에 따라 바뀌며, **오른쪽에서 왼쪽(RTL)**으로 쓴다. IME가 “조합”을 하는 방식은 한글·일본어와 다르고, 문맥형(contextual form) 선택이 핵심이다.
1. 문맥형(Contextual Forms)
Section titled “1. 문맥형(Contextual Forms)”1.1 네 가지 형태
Section titled “1.1 네 가지 형태”유니코드·폰트에서 아랍 문자는 위치에 따라 다른 모양(문맥형)을 쓴다.
| 형태 | 영어 | 설명 |
|---|---|---|
| Isolated | Isolated | 단독일 때. |
| Initial | Initial | 단어 맨 앞(오른쪽). 오른쪽만 연결. |
| Medial | Medial | 단어 중간. 양쪽 연결. |
| Final | Final | 단어 맨 끝(왼쪽). 왼쪽만 연결. |
예: “ب”(ba)는 단독일 때 한 모양, 단어 앞·중간·끝일 때 각각 다른 모양으로 그려진다.
1.2 Joining Type (유니코드)
Section titled “1.2 Joining Type (유니코드)”유니코드 UAX #9와 ArabicShaping에서 Joining_Type으로 결합 방식을 정한다.
- Dual_Joining (D): 양쪽으로 연결.
- Right_Joining (R): 오른쪽만 연결(예: 어두형).
- Left_Joining (L): 왼쪽만 연결(예: 어말형).
- Non_Joining (U): 연결 안 함(공백 등).
- Transparent (T): 조합 부호(타슈킬 등); 연결을 “통과”.
- Join_Causing (C): 연결을 유도.
폰트·렌더러가 이 속성을 보고 문맥형을 골라 그린다. IME는 보통 기본 코드 포인트(U+0600~U+06FF)만 보내고, 형태 선택은 폰트/렌더링 쪽에서 한다.
2. 유니코드 블록
Section titled “2. 유니코드 블록”- Arabic (U+0600~U+06FF): 기본 아랍 문자·기호. 문맥형은 별도 코드가 아니라 같은 코드 포인트가 위치에 따라 다른 모양으로 그려진다.
- Arabic Presentation Forms-A/B (U+FB50
FDFF, U+FE70FEFF): 레거시 조합형/연결형 표현용. 새 텍스트에는 기본 블록(U+0600~) + 폰트 문맥형을 쓰는 것이 권장된다.
3. RTL(오른쪽→왼쪽)
Section titled “3. RTL(오른쪽→왼쪽)”- 아랍어 텍스트는 논리 순서로 저장하고, 표시할 때 RTL로 배치한다.
- 캐럿·선택은 논리 오프셋으로 다루고, 화면에서는 RTL에 맞게 커서 위치를 바꾼다.
- 혼합 텍스트(아랍어 + 숫자·영문): 유니코드 양방향 알고리즘(UAX #9)에 따라 runs가 나뉜다. 에디터는 bidi 알고리즘을 적용해 그리면 된다.
4. IME·composition
Section titled “4. IME·composition”- 아랍어 IME는 키 입력을 아랍 문자 코드 포인트로 바꾼다. 한글처럼 “자모 → 음절”이 아니라, 키 → 문자(또는 문자 시퀀스) 매핑이다.
- 조합 중이 있는 IME(예: 특수 문자 조합)에서는 compositionstart → compositionupdate → compositionend가 발생하고, CompositionEvent.data에 preedit·commit 문자열이 온다.
- 단순 키 매핑만 하는 IME는 composition 없이 insertText만 올 수 있다. 에디터는 composition이 오면 preedit으로 표시하고, 오지 않으면 일반 입력으로 처리하면 된다.
5. 한글·일본어와의 차이
Section titled “5. 한글·일본어와의 차이”- 한글: 초성+중성+종성 → 한 음절(완성형). IME가 조합 결과를 preedit·commit으로 보냄.
- 일본어: 로마자/가나 → 히라가나/한자. 변환 후보가 preedit.
- 아랍어: 키 → 아랍 문자. 문맥형은 폰트/렌더링이 처리. IME는 문자 코드만 보내고, composition 이벤트는 IME 구현에 따라 있거나 없을 수 있다.
에디터는 RTL과 bidi를 지원하고, 아랍어 IME에서 composition 이벤트가 오면 한글·일본어와 동일하게 preedit/commit만 구분해 처리하면 된다.