Olive Study Room
ASCII 아스키코드, UTF-8, Unicode 본문
예전에는 영어나 몇 특수문자만 사용해서 저장할 때 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)
'Coding' 카테고리의 다른 글
[Design Pattern] 디자인패턴의 정의, GoF, MVC (0) | 2022.01.08 |
---|---|
[GitHub] 내 branch와 master branch의 버전이 일치하지 않는 경우 (0) | 2021.08.24 |
[GitHub 1] 깃허브에 올리기 + Git이란? (0) | 2021.07.05 |
[CS] Sync & Async (0) | 2021.06.05 |