... | ... | @@ -218,20 +218,26 @@ UCS(Universal Character Set)는 ISO 10646으로 정의된 문자 인코딩의 |
|
|
|
|
|
#### 유니코드의 인코딩
|
|
|
유니코드와 유니코드 인코딩을 가장 쉽게 설명하는 방법은 유니코드는 각 문자에 번호를 지정하는 방식을 말하면 인코딩은 유니코드 숫자를 표현하는 방법이라 보면 된다. 여러 인코딩 방식이 있지만 주로 사용하는 UTF-8, UTF-16, UTF-32에 대해서 설명한다.
|
|
|
|
|
|
<br />
|
|
|
* **UTF-32**
|
|
|
UTF-32는 32비트로 표현하는 방식이다. 모든 코드 포인트를 32비트에 1:1로 매핑되고, 남는 11개의 앞 비트는 모두 0으로 채운다.
|
|
|
인코딩한 값 자체가 코드 포인트이기 때문에 해당 유니코드 문자를 찾기 쉽다. UTF-8 이나 UTF-16에 비해서 공간을 많이 차지하기 때문에 메모리 공간에 큰 제약이 없거나 고정 길이 인코딩이 필요할 때 쓰인다. 주로 Unix 환경에서 문자열을 메모리에서 다룰 때 사용된다.
|
|
|

|
|
|
|
|
|
<br />
|
|
|
* **UTF-16**
|
|
|
UTF-16은 16비트로 표현하는 방식이다. BMP 영역 범위 내의 문자를 만나면 16비트로 1:1 매핑된다. 하지만 BMP 영역 범위(U+0000 ~ U+FFFF) 이외의 문자를 만나면 32비트로 표현하는 가변 길이 인코딩 방식이다. 주로 Java나 Microsoft 플랫폼에서 문자열을 다룰 때 사용된다.
|
|
|
|
|
|

|
|
|

|
|
|
|
|
|
BMP 영역을 벗어나는 문자를 인코딩 할 때에는 아래 그림과 같이 인코딩한다.
|
|
|

|
|
|
위의 변환 규칙에 따라서 변환을 하면, 인코딩 된 16비트 값이 0xD800 ~ 0xDFFF 사이의 값이 되도록 고안되었다. 변환된 값이 또 다른 문자로 잘못 인식되는 것을 막기 위해서 이 0xD800 ~ 0xDFFF 사이의 영역에는 문자가 할당되어 있지 않다. 이 영역을 Surrogate라 부르고 인코딩 된 상/하위 비트를 합쳐서 Surrogate Pair라고 부른다.
|
|
|
<br />
|
|
|
* **UTF-8**
|
|
|
UTF-8은 8비트로 표현하는 방식이다. UTF-16은 주로 사용되는 BMP 영역 범위를 인코딩 하기에는 좋았지만, ASCII 문자도 2바이트로 변환하는 것이 문제였다. ASCII 문자는 1바이트여서 UTF-16으로 변환 시 "00 41 00 42" 처럼 문자열 중간에 00이 들어가게 된다. 이는 문자열 관련 C 함수들에서 00을 NULL로 인식하여 오류를 발생시킬 수 있다. 이런 문제를 피하기 위해서 UTF-8 이 제안되었다. UTF-8은 ASCII 호환성을 주 목적으로 하기 때문에 중간에 NULL이 들어가지 않도록 만들어졌다. ASCII 영역 (U+0000 ~ U+007F) 에 대해서는 1바이트로 1:1 매핑되고, 더 큰 코드 포인트에 대해서는 다음과 같이 인코딩된다.
|
|
|

|
|
|

|
|
|
|
|
|
|코드 포인트 범위|비트수|인코딩|
|
|
|
|-------------------|-------|--------|
|
... | ... | @@ -242,6 +248,18 @@ UTF-8은 8비트로 표현하는 방식이다. UTF-16은 주로 사용되는 BMP |
|
|
|
|
|
위의 표에서 x로 표시된 부분에는 원래의 비트값을 순서대로 적는다.
|
|
|
그래서 ASCII 영역(U+0000 ~ U+007F) 내의 문자인 알파벳 같은 경우는 1바이트 인코딩, 한글은 완성형은 AC00 ~ D7AF 영역에 매핑되어 있기때문에 UTF-8로 인코딩하면 3바이트로 인코딩이 된다. 주로 웹이나 DB에서 많이 사용된다.
|
|
|
<br />
|
|
|
* **BOM**
|
|
|
바이트 순서 표식(Byte Order Mark, BOM)은 유니코드에서 엔디안을 구별하기 위해 사용되는 문자로, 코드 포인트는 U+FEFF이다. (아랍어 표현꼴 마지막 문자로 할당되어 있다. 아랍어와의 특별한 상관관계는 없다.) 엔디안은 바이트를 배열하는 방법을 말하며, 큰 단위가 앞에 나오는 빅 엔디안과 작은 단위가 앞에 나오는 리틀 엔디안으로 나눌 수 있다. 두 경우에 속하지 않거나 둘을 모두 지원하는 것을 미들 엔디안 이라고 부른다.
|
|
|
|
|
|
 
|
|
|
|
|
|
UTF-8은 바이트 순서가 정해져있기 때문에 BOM 문자가 필요없지만, UTF-16, UTF-32 에서는 엔디안의 종류에 따라서 문자열의 값이 완전히 달라지므로, 문자열의 엔디안을 구별할 수 있는 표식이 필요하다. 이를 위해 유니코드 문자열 맨 앞에 BOM 문자를 붙여서 맨 처음에 읽히는 BOM 문자의 값에 따라서 엔디안을 구별한다.
|
|
|
|
|
|
```c#
|
|
|
adkfjkadjk;aljfd
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **BOM** |