Encoding은 숫자, 특수 문자를 포함한 각종 문자, 숫자 그리고 기호를 표현하는 방법에 관한 표준. 

컴퓨터는 숫자만을 이해할 수 있기 때문에 숫자에 순차적으로 문자를 할당하는 방식으로 표준화를 지정.

대부분의 Encoding 방식은 Unicode라는 표준을 활용한다.


1. UNICODE 

컴퓨터에서 세계 각국의 언어를 통일된 방법으로 표현할 수 있게 제안된 국제적인 문자 코드 규약.

출처 : 두산백과


각 나라별 언어를 모두 표현하기 위해 나온 코드 체계가 유니코드(unicode)다. 유니코드는 사용중인 운영체제, 프로그램, 언어에 관계없이 문자마다 고유한 코드 값을 제공하는 새로운 개념의 코드다. 언어와 상관없이 모든 문자를 16비트로 표현하므로 최대 65,536자를 표현할 수 있다.

[네이버 지식백과] 유니코드 (컴퓨터 개론, 2013. 3. 10., 한빛아카데미(주))


표준 : http://www.unicode.org/charts/PDF/U0000.pdf 


65,536개 중 F0000~FFFFF, 100000~10FFFF를 제외한 구간에 각종 문자, 숫자 그리고 기호를 각각의 숫자에 매핑한 코드이다. 

F0000~FFFFF, 100000~10FFFF 사용자 정의 구간이다. 이 중 한글 구간은 AC00-D7AF.



유니코드는 한 문자를 표현하기 위한 최대 길이가 2바이트(16비트)이기 때문에 분량이 방대하다. 

표로 나타내지 않고 블록을 나누어 놓은 테이블을 참고하여 해당하는 문자 구간을 찾는다. 접두어는 U+ 이다.


2. ASCII(ANSI), UTF8, UTF16

흔히 말하는 ASCII(ANSI), UTF-8, UTF-16와 같은 인코딩 방식 모두 유니코드 표를 참조한다.

단지 각 인코딩 방식의 구간(범위)이 다를 뿐, 실제 문자를 표현할 때의 값을 U+라는 접두어를 제외하고는 같은 값을 가지게 된다.

ex) ASCII에서 A는 1000001(2) //0x41(16)이다.  UTF-8, UTF-16에서 또한 같은 값으로 표현된다.


2-1. ASCII American Standard Code for Information Interchange (ANSI code : American National Standards Institute.)

구간(범위) :  U+0000부터 U+007F(16) == 000 0000부터 111 1111(2) //한 문자당 7비트        


2-2 UTF-8와 UTF-16

UTF-8은 문자열을 8-bit(1바이트) 기반으로 저장, ANSI 문자(영어 포함)는 그대로(1 바이트로) 아시아 문자는 3 바이트로 가변 표기하는 인코딩 방식.

UTF-8은 가변 바이트를 사용하고 UTF-16의 경우에는 고정 바이트를 사용한다.

ASCII 코드 범위내의 문자를 표현할 때, UTF-8은 1바이트만을 사용하고 UTF-16의 경우에는 2바이트로 표현한다. 

따라서 UTF-8의 경우 A는 0x41로 표현되지만 UTF-16의 경우에는 0x0041(16)의 형태로 표현한다. 


UTF-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용한다. 예를 들어서, U+0000부터 U+007F 범위에 있는 ASCII 문자들은 UTF-8에서 1바이트만으로 표시된다. 4바이트로 표현되는 문자는 모두 기본 다국어 평면(BMP) 바깥의 유니코드 문자이며, 거의 사용되지 않는다. (출처: https://ko.wikipedia.org/wiki/UTF-8)


추가내용1: UTF16은 Little-Endian이냐, Big-Endian이냐에 따라 0x4100이 될수도, 0x0041이 될 수도 있다.

추가내용2: UTF32 역시 LE냐 BE냐에 따라 0x4100 0000 이거나, 0x0000 0041이 된다.


UTF-8

FSS-UTF(File System Safe UCS/Unicode Transformation Format)

범위 : 00 00 00(16)부터 10 FF FF(16)

          00 00 00(16)부터 00010000 11111111 11111111(2)


범위(구간)


3. Percent Encoding

URL Encoding 방식이며 RFC3986 protocol (https://tools.ietf.org/html/rfc3986)을 따른다.

URL Encode, Percent Encode는 %를 붙인 UTF-8 인코딩이라고 할 수 있다.

url encoding 표의 !는 %21 이고 이를 UNICODE표에서 찾아보면은 다음과 같다.

 

U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F

0000 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI

0010 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US

0020 ! " # $ % & ' ( ) * + , - . /


인코딩 UTF-8 EUC-KR

16진수 표현 EC 9C 84 ED 82 A4 EB B0 B1 EA B3 BC C0 A7 C5 B0 B9 E9 B0 FA

퍼센트 인코딩 %EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC %C0%A7%C5%B0%B9%E9%B0%FA


기본적으로는 %만 붙여놓으면 해석이 되지만 RFC 3986 규약을 따른다. (https://tools.ietf.org/html/rfc3986)

RFC 3986에는 URI에서 중요하게 사용되는 예약(reserved)문자가 있고 인코딩이 필요없는 비예약 문자가 있다.


%7B%22impId_re%22%3A%22%7Breengagement_cb_param1%7D%22%2C%20%22propertyId_re%22%3A%22%7Breengagement_cb_param2%7D%22%7D


{"impId_re":"{reengagement_cb_param1}", "propertyId_re":"{reengagement_cb_param2}"}


위와 같이 예약문자만 인코딩 되어있는 것을 확인 할 수 있다.


4. 증명과정

file filename

xxd -i filename


inmobis-MacBook-Pro:Documents inmobi$ cat test.txt 

안녕a!

// 인코딩 확인

inmobis-MacBook-Pro:Documents inmobi$ file test.txt 

test.txt: UTF-8 Unicode text

inmobis-MacBook-Pro:Documents inmobi$ file -I test.txt

test.txt: text/plain; charset=utf-8

// 헥사값 확인

inmobis-MacBook-Pro:Documents inmobi$ xxd -i test.txt 

unsigned char test_txt[] = {

  0xec, 0x95, 0x88, 0xeb, 0x85, 0x95, 0x61, 0x21, 0x0a

};

unsigned int test_txt_len = 9;

inmobis-MacBook-Pro:Documents inmobi$ xxd test.txt 

00000000: ec95 88eb 8595 6121 0a                   ......a!.


5. UTF8은 가변 길이(비트) 문자 인코딩


inmobis-MacBook-Pro:Documents inmobi$ xxd test3.txt 

00000000: 610a                                     a.

//0a: LF (Line Feed) 이니까 문자가 아니다. 따라서 a는 ASCII 표준을 따라서 7비트(16진수 61)로 표현되다. 
//그리고 실제 문자 인코딩을 확인해보면 아래와 같이 나온다.
inmobis-MacBook-Pro:Documents inmobi$ file test3.txt 
test3.txt: ASCII text

한국어와 영어를 모두 기입하면 UTF-8이 문자 인코딩 방식이지만 a의 경우에는 8비트만 차지하게 된다. ASCII는 7비트 인코딩 방식. 

inmobis-MacBook-Pro:Documents inmobi$ cat test3.txt

a오늘

inmobis-MacBook-Pro:Documents inmobi$ file test3.txt 

test3.txt: UTF-8 Unicode text

inmobis-MacBook-Pro:Documents inmobi$ xxd test3.txt 

00000000: 61ec 98a4 eb8a 980a                      a.......


참고: 헥스에디터(Hex-editors) : 바이너리 파일을 분석하거나 수정할 때 사용한다. 파일을 16진수 코드로 보여준다.

(16진수 코드나 어셈코드나 같은겁니다. 어셈코드는 16진수 코드를 우리가 보기 쉽게 문자로 치환했을 뿐입니다. 예를 들어 16진수로 0x6A 라는 숫자가 어떤 일을 한다고 했을때 이 숫자만 보고 그 일을 한다는 것을 사람이 알기에 쉽지 않으므로 여기에 PUSH 라는 이름을 붙여 사람이 해석하기 쉽게 해주는겁니다. 즉 16진수 코드랑 어셈코드는 같은 것을 표현하는데 숫자냐, 문자냐일 뿐인것이죠)


출처: http://dakuo.tistory.com/37 [hacker dakuo]

출처: https://ko.wikipedia.org/wiki/UTF-8

출처: http://norux.me/31 [노루의 씨분투 세상]

출처: http://ssaemo.tistory.com/28 [뾰족뾰족]


'Notes' 카테고리의 다른 글

Manifest 속성 참고  (0) 2017.05.02
Maven repository  (0) 2017.05.02
REST, OPEN API  (0) 2017.04.18
Intent  (0) 2017.03.16
Android Beta Test  (0) 2017.03.15

+ Recent posts