토착 문자 체계를 효과적으로 디지털화하기 위해서는 먼저 문자 체계의 유형을 정확히 이해해야 합니다. 문자 체계는 표현 방식과 음운론적 구조에 따라 여러 유형으로 분류됩니다.
표음 문자는 언어의 소리를 기록하는 문자 체계로, 다시 세분화됩니다:
| 유형 | 설명 | 예시 | 디지털화 복잡도 |
|---|---|---|---|
| 음소 문자 | 각 글자가 하나의 음소(자음 또는 모음)를 나타냄 | 한글, 라틴 문자, 키릴 문자 | 중간 |
| 음절 문자 | 각 글자가 하나의 음절을 나타냄 | 가나, 체로키 문자, 이누이트 음절문자 | 높음 |
| 아부기다 | 자음 기본, 모음은 부가 기호로 표현 | 데바나가리, 타밀 문자, 에티오피아 문자 | 매우 높음 |
| 아브자드 | 주로 자음만 기록, 모음은 선택적 | 아랍 문자, 히브리 문자 | 높음 |
표의 문자는 각 글자가 단어나 형태소를 나타내는 체계입니다. 한자, 마야 문자 등이 이에 속하며, 디지털화 시 수천 개의 글자를 인코딩해야 하는 도전이 있습니다.
문자 인코딩은 문자를 컴퓨터가 이해할 수 있는 숫자 코드로 변환하는 과정입니다. WIA-LANG-002는 다음과 같은 인코딩 원칙을 제시합니다:
// WIA-LANG-002 인코딩 메타데이터 구조
{
"standard": "WIA-LANG-002-v1.0",
"script": {
"name": "Cherokee",
"iso15924": "Cher",
"direction": "ltr",
"philosophy": "弘益人間"
},
"encoding": {
"blocks": [
{
"name": "Cherokee",
"range": "U+13A0-U+13FF",
"characters": 85,
"type": "syllabary"
},
{
"name": "Cherokee Supplement",
"range": "U+AB70-U+ABBF",
"characters": 80,
"type": "syllabary"
}
],
"properties": {
"case_sensitive": false,
"combining_marks": true,
"normalization": "NFC"
}
}
}
디지털 타이포그래피에서 '문자(character)'와 '글리프(glyph)'는 구별되는 개념입니다:
하나의 문자가 여러 글리프로 표현될 수 있으며(합자, 문맥 형태 등), 반대로 여러 문자가 하나의 글리프로 합쳐질 수도 있습니다.
// 글리프 대체 규칙 정의 (OpenType GSUB)
const glyphSubstitution = {
script: "devanagari",
features: {
"akhn": { // Akhand (필수 합자)
type: "ligature",
rules: [
{ input: ["क", "्", "ष"], output: ["क्ष"] } // ka + virama + sha = ksha
]
},
"half": { // Half forms
type: "contextual",
rules: [
{ input: ["क", "्"], output: ["क्"], context: "followed_by_consonant" }
]
}
},
philosophy: "弘益人間"
};
많은 토착 문자 체계는 기본 문자에 발음 구별 부호나 성조 표시를 결합하여 사용합니다. 이러한 결합 문자(combining characters)의 처리는 디지털화의 핵심 과제 중 하나입니다.
| 정규화 형식 | 약어 | 설명 | 사용 시나리오 |
|---|---|---|---|
| 정준 분해 | NFD | 합성 문자를 기본 문자와 결합 문자로 분해 | 텍스트 검색, 정렬 |
| 정준 결합 | NFC | 기본 문자와 결합 문자를 하나의 합성 문자로 결합 | 저장, 전송 |
| 호환 분해 | NFKD | 호환 문자까지 포함한 완전 분해 | 호환성 처리 |
| 호환 결합 | NFKC | 호환 문자까지 포함한 완전 결합 | 데이터 정리 |
// 유니코드 정규화 예시
const normalizeText = (text, form = 'NFC') => {
// WIA-LANG-002 표준 정규화
const normalized = text.normalize(form);
return {
original: text,
normalized: normalized,
form: form,
codePoints: [...normalized].map(c =>
'U+' + c.charCodeAt(0).toString(16).toUpperCase().padStart(4, '0')
),
philosophy: '弘益人間'
};
};
// 사용 예시 - 한글
const hangul = normalizeText('한글', 'NFC');
console.log(hangul);
// {
// original: "한글",
// normalized: "한글",
// form: "NFC",
// codePoints: ["U+D55C", "U+AE00"],
// philosophy: "弘益人間"
// }
// 데바나가리 예시
const devanagari = normalizeText('हिन्दी', 'NFD');
console.log(devanagari.codePoints);
// ["U+0939", "U+093F", "U+0928", "U+094D", "U+0926", "U+0940"]
일부 토착 문자 체계는 오른쪽에서 왼쪽(RTL)으로 쓰이거나, 세로 쓰기를 사용합니다. 이러한 다양한 쓰기 방향을 지원하는 것은 WIA-LANG-002의 핵심 요구사항입니다.
// 양방향 텍스트 처리 설정
const BiDiConfig = {
standard: "WIA-LANG-002",
scripts: {
arabic: {
direction: "rtl",
joinning: true,
contextual_forms: ["initial", "medial", "final", "isolated"],
philosophy: "弘益人間"
},
mongolian: {
direction: "ttb",
rotation: 90,
line_direction: "ltr",
philosophy: "弘益人間"
}
},
processBiDi: function(text, scriptId) {
const script = this.scripts[scriptId];
return {
text: text,
direction: script.direction,
rendering: this.calculateLayout(text, script),
standard: this.standard
};
},
calculateLayout: function(text, script) {
// 레이아웃 계산 로직
return {
direction: script.direction,
segments: this.segmentText(text, script)
};
}
};
남아시아와 동남아시아의 많은 문자 체계는 복잡한 결합 규칙을 가지고 있습니다. 이러한 문자들을 정확히 렌더링하기 위해서는 OpenType 폰트 기술과 복잡한 텍스트 레이아웃(Complex Text Layout, CTL) 엔진이 필요합니다.
// 복잡한 텍스트 렌더링 파이프라인
class ComplexTextRenderer {
constructor(config) {
this.standard = "WIA-LANG-002";
this.script = config.script;
this.font = config.font;
this.philosophy = "弘益人間";
}
render(text) {
// 1. 정규화
const normalized = text.normalize('NFC');
// 2. 그래픽 클러스터 분할
const clusters = this.segmentGraphemeClusters(normalized);
// 3. 형태 변환 (GSUB)
const shaped = this.applyGSUB(clusters);
// 4. 위치 조정 (GPOS)
const positioned = this.applyGPOS(shaped);
// 5. 렌더링
return this.renderGlyphs(positioned);
}
applyGSUB(clusters) {
// Glyph Substitution 규칙 적용
// - 합자(ligatures)
// - 문맥 대체(contextual substitution)
// - 필수 합자(required ligatures)
return clusters.map(c => this.font.substituteGlyph(c));
}
applyGPOS(glyphs) {
// Glyph Positioning 규칙 적용
// - 커닝(kerning)
// - 마크 위치(mark positioning)
// - 커서 위치(cursive attachment)
return glyphs.map(g => this.font.positionGlyph(g));
}
}
효과적인 문자 입력 시스템(IME)은 사용자가 자연스럽고 빠르게 텍스트를 입력할 수 있도록 해야 합니다. WIA-LANG-002는 다양한 입력 방식을 지원합니다:
| 입력 방식 | 설명 | 적합한 문자 체계 | 예시 |
|---|---|---|---|
| 직접 입력 | 각 키가 하나의 문자에 대응 | 음소 문자, 음절 문자 | 한글 2벌식, 3벌식 |
| 변환 입력 | 로마자로 입력 후 변환 | 한자, 가나, 한글 | 일본어 로마자 입력 |
| 조합 입력 | 여러 키를 조합하여 하나의 문자 생성 | 데바나가리, 타밀 문자 | InScript 키보드 |
| 예측 입력 | AI 기반 다음 문자 예측 | 모든 문자 체계 | 모바일 키보드 |
| 필기 인식 | 손글씨를 디지털 텍스트로 변환 | 한자, 한글, 아랍 문자 | 터치스크린 입력 |