OpenCV를 활용해서, 수료증 생성하는 기능을 구현던 중, OpenCv의 putText 메서드가 아스키코드로만 입력이 된다는 것을 알게되었다. 평소 문자열 인코딩 과정에 아스키,utf-8,유니코드 등이 있는것을 알고는 있었지만 중요성을 느끼지 못하게 자세한 내용을 정리한 적이 없어서 정리를 했다.

ASCII (American Standard Code For Information Interchange)

  • 아스키는 최초의 문자열 인코딩 방식이다.
  • 7비트로 구성되어 있으며, 영어를 위한 문자, 숫자, 특수문자, 기호 등 128개 문자를 표현할 수 있다.
    • 컴퓨터의 기본 저장단위는 바이트(byte)이고, 1byte는 8bit이다.
    • 1byte에는 2^8 = 256개의 고유한 값 저장할 수 있다.
    • 아스키는 7bit이므로 2^7 = 128개의 고유한 값 저장
  • 영어만을 고려하여 만들어 졌고, 일본어,중국어,한국어 등의 언어는 표현 불가

ANSI (American National Standard Insitute)

  • 8bit로 구성되어 있으며 256개의 문자 표현
  • 아스키의 확장판
  • 앞의 7비트는 아스키와 동일하고, 뒤에 1비트를 이용하여 다른 언어의 문자를 표현
  • 새로 추가된 128개의 문자로 모든 언어의 문자를 표현할 수 없다
    • Code Page개념 등장
      • 각 언어별로 code값을 주고, code마다 다른 문자열 표를 의미하도록 약속
      • ANSI = ASCII(7bit) + CodePage(1bit)

UNICODE

  • unicode는 전 세계의 모든 문자를 컴퓨터에서 일관된게 표현할 수 있도록 고안된 코드 조합
  • '인코딩'이 아니라, 전세계 거의 모든 문자를 2bytes(2^16 = 65,536)숫자로 1:1 매핑 시키는 방식을 말하고, 유니코드를 표현하는 여러가지 '인코딩'방식들이 존재하는 것
    • utf-8
    • utf-16
  • '가'를 찾아보면 유니코드 값이 'AC00'인 것을 알 수 있다.
    • 16진수 AC00은 10진수로 44032인데 8bit로 나누기에 너무 크다. 이 값을 8bit단위로 쪼개어 저장하는 방법이 UTF-8이다.

UTF-8

  • 유니코드를 위한 가변길이 문자 인코딩 방식 중 하나
  • ansi는 다국어 지원하기 위해 code page정보를 미리 알고 있어야 하지만, utf-8방식은 멀티바이트 개념을 사용하여 하나의 character set에 거의 모든 문자를 넣었다.
    • 멀티바이트란?
      • 표현해야하는 문자에 따라 글자 크기를 가변으로 변경하여 사용
      • ansi는 고정바이트(1byte)형태로 최대 256까지만 표현
      • utf-8은 멀티바이트(1~4bytes)로 최대 1,11,,064자 까지 표현
  • 첫 128자는 아스키 코드값으로 ansi,utf-8이 동일하다. 그래서 영어권은 1byte만 사용
  • 한국,중국,일본 등 동아시아권은 3bytes이상 사용
  • 중동,유럽언어는 2bytes를 사용
  • 3bytes이상 문자를 사용할 경우에는 비효율적

UTF-16

  • 16bit기반으로 저장하는 utf-8변형
  • 한글의 경우, utf-8로 저장하면 3bytes가 필요한데, utf-16으로 저장하면 2bytes면 되어 용량의 이점이 있다.
  • 경우에 따라 2bytes이상을 사용할 경우가 있어 용량의 이점이 크다고 보긴 어렵다
  • ansi와 호환이 안된다.

UTF-32

  • 모든 문자를 4bytes로 인코딩
  • 가변길이 인코딩 방식에 대한 고민을 하고 싶지 않을 때 유용할 수 있다,.
  • 매우 비효율적으로 메모리를 사용하므로 자주 사용 x