Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Olive Study Room

ASCII 아스키코드, UTF-8, Unicode 본문

Coding

ASCII 아스키코드, UTF-8, Unicode

Olive Dev 2021. 6. 26. 18:28

예전에는 영어나 몇 특수문자만 사용해서 저장할 때 1byte면 충분했지만,

이후 전 세계 언어를 표현하기 위해 유니코드를 만들었다. ex) '가' -> 'AC00'

하지만 unicode는 언어별로 읽어야 하는 바이트가 다르기 때문에 유니코드 앞에다 UTF-8이나 UTF-16과 같은 것을 붙여 인코딩을 해야한다.

 

UTF-8 (Universal Coded Character Set + Transformation Format-8-bit)

  • 1바이트 8비트.
  • 유니코드로 각 글자가 정의되었지만 컴퓨터가 알아들을 수 있도록(2진법으로) 어떻게 저장할까?(=인코딩은 어떻게 할 것인가)
  • UTF-8은 가변 인코딩 방식으로, 글자마다 byte 크기가 다르다는 뜻이다.
바이트 수 비트 수 유니코드 종류
1 8 U+0000 - U+007F 숫자, 알파벳
2 16 U+0080 - U+07FF 아라비아 문자
3 24 U+0800 = U+FFFF 한글, 한자
4 32 U+10000 - U+1FFFFF 어려운 한자 등
  • 다른 바이트의 문자들이 섞여있어도 괜찮도록 UTF-8에서는 각각의 바이트의 앞에 숫자를 붙인다.

 

1바이트의 문자 앞엔 0

2바이트의 문자 앞엔 110/10

3바이트의 문자 앞엔 1110/10/10

 

이 앞 부분 숫자를 제외한 것은 '유효 비트'라고 하고 이것을 16진수로 바꾸면 유니코드인 것!

 

결론

유니코드(16진수)-종류 (그냥 지정한 것! 이유x)

유니코드 + 앞자리 숫자 -> UTF-8

 

 

ASCII

미국 정보교환 표준 부호(American Standard Code for Information Interchange
영문 알파벳을 사용하는 대표적인 문자 인코딩
  • 7비트 인코딩(128개 = 33개의 출력 불가능 문자 + 95개 출력 가능 문자(52개 알파벳 대소문자+10개 숫자+32개 특수문자+공백 문자)) 
  • 제어문자는 사용되지 않는다.
  • 7비트인 이유 : 예전에는 나머지 1비트는 Parity Bit를 붙여 7비트 중 1의 개수가 홀수면 1, 짝수면 0으로 해서 전송 도중 신호가 변질된 것을 검출했다. 현재는 검출에 사용하지 않고 맨 앞 비트에 0을 붙인다.
  • 아스키가 사용되면서 확장 인코딩들이 등장하고 이를 아스키라고 부르기도 한다.

 

Unicode 유니코드

전 세계의 모든 문자를 다루도록 설계된 표준 문자 전산 처리 방식
  • ISO/IEC 10646 Universal Character Set(확장 ASCII로 전세계 모든 문자를 담고 있음)과 UCS, UTF 등의 인코딩 방식, 문자 처리 알고리즘 등을 포함한다.
  • 초창기에는 ASCII 의 로마자 위주였고 1바이트에 각 나라가 자국 문자를 할당했는데 글자가 깨져서 2~3바이트에 모든 문자를 할당하여 해결했다. 하지만 너무 길어져서 가변길이 문자 인코딩(UTF-8)을 도입해서 기존 ASCII 와도 호환되도록 했다.
  • 16진수로 문자-코드를 1대1로 매칭한 문자표인 셈이다.
  • 첫글자는 확장 ASCII중 하나인 ISO/IEC 8859-1을 그대로 차용한 것이다.

 

 


Swift에서 char를 아스키코드로 바꾸는 방법

 

1. ascilValue 사용

- UInt8?로 반환하기 때문에 Int로 변환해야 출력가능하다.

* UInt8이란?

unsigned 부호가 없는,  즉 양수만 존재하는 Integer 타입 8비트라는 것. 범위는 부호가 없기 때문에 두 배가 된다. 

 

2. unicodeScalars 사용

끝에 꼭 first.value를 써줘야만 한다. 

 

 

 

=> 사실 ascilValue를 돌리면 unicodeScalars의 연산이 돌아간다. 때문에 애초부터 unicodeScalars를 써주는게 조금 더 빠르다.

 

 

 

예시

 11654
let line = Character(readLine()!)
print(Int(line.asciiValue!))

 11654 - 2
print(Character(readLine()!).unicodeScalars.first!.value)

 

Comments