-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.html
125 lines (114 loc) · 5.71 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>BaseHangul</title>
<style>
/* 노토 산스 폰트 적용 */
@import url(https://fonts.googleapis.com/earlyaccess/notosanskr.css);
body {
font-family: 'Noto Sans KR', 'Helvetica', 'Arial', sans-serif;
/* Centering */
max-width: 55em;
margin: 0 auto;
/* 여백 조정 */
line-height: 1.5;
padding: 1.5em 1em 3em;
/* 글자색 조정 */
color: rgb(21, 21, 21);
}
/* 제목 밑에 구분선 추가 */
h1 {
border-bottom: 2px solid #dadada;
padding-bottom: 0.1em;
margin: 0.67em 0;
}
/* 소단원 앞에 여백 추가, 밑에 작은 구분선 추가 */
h2 { margin-top: 1em; padding-top: 1em; }
/* 텍스트 양쪽 맞추기 */
p { text-align: justify; }
/* 전체적으로 얇은 글꼴 적용 */
p, footer { font-weight: 300; }
th, td { font-weight: 400; }
/* 하이퍼링크 스타일링 */
a { color: #e81c4f; text-decoration: inherit; }
a:hover { text-decoration: underline; }
/* 문서 하단 */
footer {
margin-top: 5em;
padding-top: 1em;
border-top: 1px solid #eee;
font-size: 0.8em;
}
footer > em { float: right; }
/* 전통적인 테이블 CSS */
/* TODO: 이쁘게 고치기 */
table.border { border: 1px outset gray; }
table.border th, td { border: 1px inset gray; }
</style>
</head>
<body>
<h1>BaseHangul 1.1</h1>
<p>BaseHangul은 한글을 이용한 바이너리 인코딩입니다. 바이너리 데이터를 KS C 5601 규격에 포함된 한글 문자로 변환합니다.</p>
<h2>I. 변환 방식</h2>
<p>5바이트(40비트)가 4글자가 됩니다.</p>
<h3>왜 40비트인가?</h3>
<p>KS C 5601에 포함된 한글 조합은 총 2350자이므로 순수한 한글 문자만을 이용해서 11비트를 한 글자로 표현할 수 있습니다. 하지만 11비트를 한 문자로 조합하면 8(1바이트)과의 최소공배수가 88인 관계로 변환 최소 단위가 88비트가 되어 낭비가 심해집니다. 그래서 1028개의 문자만을 선별하여 10비트를 한 글자로 표현하기로 했습니다. 따라서 변환 최소 단위는 8과 10의 최소공배수인 40비트가 됩니다.</p>
<h3>사용되는 조합은?</h3>
<p>KS C 5601 조합 중 사전순으로 앞에서부터 1028개의 조합만을 사용합니다. "흐"의 경우 범위 밖에 있습니다만, padding 문자로 사용됩니다.</p>
<h2>II. 예제</h2>
<h3>예제 1: 5바이트를 채운 경우</h3>
<table class=border>
<tr><th>바이트 문자</th><th colspan="8">1 (49)</th><th colspan="8">2 (50)</th><th colspan="8">3 (51)</th><th colspan="8">a (97)</th><th colspan="8">b (98)</th></tr>
<tr><th>비트 값</th>
<td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td><td>1</td>
<td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>1</td><td>0</td>
<td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>1</td><td>1</td>
<td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td>
<td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td>
</tr>
<tr><th>10비트 문자</th>
<th colspan="10">꺽 (196)</th><th colspan="10">먹 (803)</th><th colspan="10">꼍 (216)</th><th colspan="10">녜 (354)</th>
</tr>
</table>
<h3>예제 2: 5바이트를 채우지 못한 경우</h3>
<table class=border>
<tr><th>바이트 문자</th><th colspan="8">1 (49)</th><th colspan="8"></th><th colspan="8"></th><th colspan="8"></th><th colspan="8"></th></tr>
<tr><th>비트 값</th>
<td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td><td>1</td>
<td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td>
<td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td>
<td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td>
<td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td>
</tr>
<tr><th>10비트 문자</th>
<th colspan="10">꺽 (196)</th><th colspan="10">흐 (-1)</th><th colspan="10">흐 (-1)</th><th colspan="10">흐 (-1)</th>
</tr>
</table>
<p>중간에 잘린 경우 0으로 padding하며, 10비트째로 padding일 경우 NULL문자 "가" 대신 padding 문자 "흐"를 출력합니다.</p>
<h3>예제 3: 마지막 40비트가 5바이트째 없이 끝난 경우</h3>
<table class=border>
<tr><th>바이트 문자</th><th colspan="8">1 (49)</th><th colspan="8">2 (50)</th><th colspan="8">3 (51)</th><th colspan="8">d (100)</th><th colspan="8"></th></tr>
<tr><th>비트 값</th>
<td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td><td>1</td>
<td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>1</td><td>0</td>
<td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>1</td><td>1</td>
<td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td>
<td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td>
</tr>
<tr><th>10비트 문자</th>
<th colspan="10">꺽 (196)</th><th colspan="10">먹 (803)</th><th colspan="10">꼐 (217)</th><th colspan="10">빎 (1024)</th>
</tr>
</table>
<p>5바이트째 없이 끝난 경우 인코드 후 디코드하면 원래는 없었던 NULL이 붙어 나오기 때문에 예외로 지정하였습니다.</p>
<p>마지막 10비트를 8만큼 오른쪽으로 시프트한 후 1024를 더해주면 됩니다.</p>
<h2>III. 구현예제</h2>
<p>PHP로 구현해두었습니다.</p>
<p><a href="https://github.com/koreapyj/basehangul" target="_blank">https://github.com/koreapyj/basehangul</a></p>
<footer>
by <a href="https://twitter.com/koreapyj" target="_blank">ハルカナソラ</a>,
2014년 한글날
<em>Last Change: 2014/11/06 1:14</em>
</footer>
</body>
</html>