유니코드의 등장 배경
아스키코드가 영문 알파벳을 사용하는 대표적인 문자 인코딩이라면, 유니코드는 전 세계의 모든 문자를 표현할 수 있는 산업 표준이다.
좀 더 자세히 차이점을 알아보자
1바이트로 구성되어 있는 아스키 코드는 8비트(==1바이트) 중 7개의 비트만 사용한다. 나머지 1비트는 Parity Bit이라고 불리는 오류 체크를 위한 비트로 사용한다.
예를 들어 아스키 코드 65 인 문자 "A" 는 이진법으로 1000001 로 나타낼 수 있다
알파벳을 포함, 영문 키보드로 입력할 수 있는 모든 기호들이 아스키 코드로 할당되어 있다. 매우 단순하고 간단하여 많은 곳에서 사용되었다.
하지만, 아스키 코드는 7개의 비트만을 사용하므로 총 2^7 = 128개의 부호밖에 나타낼 수없다. 이를 보완하기 위해 8비트로 확장한 ANSI 코드가 나오기도 했다. 따라서 이 ANSI 코드는 2^8=256개의 부호를 나타낼 수 있었지만, 그럼에도 전 세계의 모든 문자를 나타내기에는 역부족이었다.
💡 이러한 문제를 해결할 수 있는 방법이 바로 유니코드이다.
유니코드는 전 세계의 문자를 일관되게 표현하는 업계 표준이며 1바이트로 구성되어 있는 아스키코드와 달리 2바이트, 즉 16비트로 문자를 표현할 수 있다. 따라서 2^16=65536 개의 문자를 표현할 수 있다.
2진법으로는 0000 0000 0000 0000 ~ 1111 1111 1111 1111까지, 16진법으로는 0x0000 ~ 0 xFFFF까지 표현이 가능하다는 뜻이다.
여기서 유니코드는 0~127의 숫자는 ASCII와 동일한 의미를 갖는다. 예를 들어 10진법 65는 아스키 코드나 유니코드나 모두 'A'를 나타낸다.
한글 프로그램을 사용해 본 사람이라면 유니코드 문자표를 본 적이 있을 것이다. 이처럼 유니코드는 알파벳뿐만 아니라 다양한 언어, 기호, 이모티콘 등등 엄청나게 많은 문자들을 표현할 수 있다.
유니코드 문자는 해당 글자의 코드를 표기할 때 주로 U+(16진수 숫자)의 형태로 쓴다. 예를 들어 한글 '가'는 유니코드에서 16진수로 AC00(=10진수 44032)라는 코드 넘버를 가지는데, 이를 U+AC00으로 적는 식이다.
유니코드는 초창기 2^16개의 문자를 표현할 수 있었지만, 이것마저 부족해지게 되자, Plane이라 불리는 17개의 영역이 각각 2^16개의 문자를 표현할 수 있도록 확장하였다. 여기서는 유니코드를 중점적으로 다루지 않을 거기 때문에 이 부분에 대한 내용은 아래 블로그를 참고하자.
https://code-lab1.tistory.com/233
utf-8 은 뭘까
사실 그래서 아까 유니코드 얘기를 했던 것이다. 두둥!!
utf-8 은 전 세계의 모든 문자를 표현할 수 있는 유니코드 문자 인코딩 방식 중 하나이다.
import 'dart:convert';
void main() {
String text = 'Hello, world!';
List<int> bytes = utf8.encode(text); // 문자열을 바이트 배열로 변환
String base64Str = base64Encode(bytes); // 바이트 배열을 Base64 문자열로 인코딩
print(base64Str); // SGVsbG8sIHdvcmxkIQ==
}
utf.8 로 인코딩함으로써 text 는 유니코드가 된다고 생각하면 된다
아까 유니코드는 몇 바이트라고? -> 2바이트다!
UTF 약어이고 원래 뜻은 (Unicode Transformation Format)이다. 즉, Unicode를 인코딩하는 방법이다. 8의미는 8비트 1바이트를 기준으로 인코딩한다
Base64 를 왜 사용하는 걸까
저 위의 코드에서 Base64 는 또 뭘까? 그리고 왜 사용하는 걸까? (질문 폭탄러..)
👀 Base64 인코딩
Base64 인코딩의 컨셉은 화면에 표시되지 않는 이진데이터(바이너리)를 출력 가능한 문자(ASCII)로 대체하는 것이다. 64란 이름을 쓰는 이유는 이 변환에 사용되는 글자가 총 64개라서 그렇다.
보통 아래와 같이 쓴다
- A~Z: 26글자
- a~z: 26글자
- 0~9: 10글자
- 기호 2글자: + 또는 /
그리고 마지막 연산 중에 모자라는 비트가 생기면 = 로 채워 넣는다. 그래서 보통 = 가 0-2개 정도 있다
근데 왜 ASCII 로 대체하는걸까?
Base64 인코딩에서 ASCII 문자열을 사용하는 이유는, ASCII 문자열은 거의 모든 컴퓨터 및 통신 시스템에서 지원되기 때문입니다.
따라서, Base64 인코딩에서 ASCII 문자열을 사용하는 것은 크로스 플랫폼 및 다양한 시스템 간 호환성을 보장하기 위한 것입니다.
💡 Base64 인코딩 이유
Base64는 이메일이나 웹에서 바이너리 데이터를 안전하게 전송하고 저장하기 위해 개발되었다.
이는 이메일과 같은 텍스트 기반 프로토콜에서는 바이너리 데이터를 전송할 수 없기 때문이다.
예를 들어, 이미지나 첨부 파일과 같은 바이너리 데이터를 이메일로 전송하려면 Base64로 인코딩하여 문자열로 변환한 후 전송한다.
Base64 인코딩은 다양한 프로그래밍 언어와 플랫폼에서 지원된다.
대부분의 언어에서는 Base64 인코딩 및 디코딩을 수행하는 라이브러리를 제공하고 있다.
자! 그래서 정리해서
만약 "안녕하세요" 라는 문자열을 Base64 로 인코딩한다면 다음과 같은 과정을 거친다
- Base64로 인코딩할 때는, 먼저 해당 문자열을 바이트 문자열로 변환한다. (utf-8 인코딩 사용)
- 이 바이트 문자열은 이미 이진 데이터이므로, 따로 이진수로 변환하지 않는다.
- 그 다음, 이 바이트 문자열을 Base64 인코딩 알고리즘에 따라 텍스트로 변환한다.
'💻 컴퓨터 개론' 카테고리의 다른 글
x86, x64, x86_64, arm (0) | 2023.07.02 |
---|---|
IP 관련 용어 정리 (0) | 2023.06.10 |
ASP, PHP, JSP 가 무엇인지 모르겠는 사람들을 위해 (0) | 2020.06.19 |
TCP/IP 에 대하여 (0) | 2020.06.17 |
OSI 모델과 네트워크 장치 (0) | 2020.06.17 |