기본
•
컴퓨터는 데이터를 0,1로 저장한다.
ASCII
American Standard Code for Information Interchange (ASCII)
•
60년대 텔레프린터(전보를 보내기 위한 기기)가 데이터를 주고받기 위한 표준이 필요하여 개발됨
•
7비트 이진수로 0~127까지만 표현가능했음
•
영어권 국가에선 문제가 없었으나, 각 국가는 각자의 인코딩을 사용했음 → 당시 한국은 EUC-KR을 사용
•
WWW가 생기기 시작하면 인코딩 전세계 웹의 표준이 필요해졌음 → 유니코드의 등장
•
비트당 1대1 대응으로 해당값이 해당되는 글자가 매핑되어있으므로 출력할 수 있는 글자가 정해져 있다.
단어정리
Code Point
•
U+<hex>와 같은 형태로 하나의 글자에 할당된 숫자
•
U+는 Unicode라는 prefix
•
그저 숫자에 불가하다. 더 과장해석 하지말고 그냥 숫자라고 생각하기.
Code Unit
•
Code Point는 추상적인 개념이고 실제 하드디스크, 메모리에서 다뤄지는, 조작되는 개념은 Code Unit
•
문자 인코딩(Character Encoding) → 추상적인 Code Point를 실제 비트에 저장할 수 있도록 Code Unit으로 변환하는 작업
◦
문자 인코딩은 UTF-8, UTF-16, UTF-32가 될 수 있다.
•
자바스크립트는 내부적으로 UTF-16을 사용하므로 “a”는 하나의 Code Unit으로 표현할 수 있다.
console.log('\uD83D\uDE00'); // => '😀'
TypeScript
복사
Surrogate Pairs
•
◦
U+1f6—은 0xD83D, 0xDE00 두개의 값으로 저장된다.
Unicode
•
국제 기준임
•
ASCII와의 제일 큰 차이점은 32비트까지 사용할 수 있다는 점 + UTF 8, UTF 16, UTF 32
•
U+ 접두사는 유니코드를 의미 (U+1F4A9) → 실제 데이터가 저장될때 저장되는 값은 아님.
•
유니코드 인코딩 하는 방식 → UTF
"Unicode Transformation Format - 8 bits”
UTF 8
‘UTF-8 saves space. In UTF-8, common characters like “C” take 8 bits, while rare characters like “
” take 32 bits. Other characters take 16 or 24 bits. A blog post like this one takes about four times less space in UTF-8 than it would in UTF-32. So it loads four times faster.’
•
이름과 같이 1바이트만 사용 → 만약 해당 글자가 4바이트 까지 필요할 경우 4바이트까지 사용한다, 가변 길이
•
유니코드에 방식에서 갖아 많이 쓰이는 인코딩 방식
•
첫 128개문자는 ASCII와 정확히 일치하므로 ASCII와 역호환됨
•
인코딩에 간단한 비트연산만 사용되므로 효과적이다.
UTF 16
•
UTF 8과의 차이점은 최소 사용 비트가 항상 16비트란 점
자바스크립트에서 Unicode
let poop = '💩';
console.log( poop.length );
// Outputs 2
TypeScript
복사
•
자바스크립트 내부적으로는 UTF-16이 사용된다.
•
“a’와 같은 문자는 하나의 코드유닛으로 표현 가능하나,
이모티콘은 코드 포인트 U+1F4A9를 가지며, 이는 UTF-16에서 두 개의 코드 유닛, 0xD83D와 0xDCA9로 표현된다.
console.log('cafe\u0301'); // => 'café'
console.log('café'); // => 'café'
TypeScript
복사
•
모든 문자열의 요소들은 자바스크립트 엔진에 의해 code unit으로 자동 변환된다.
const smile = '\uD83D\uDE00';
console.log(smile); // => '😀'
console.log(smile.length); // => 2
const smileEmoji = '😀';
console.log(smileEmoji); // => '😀'
console.log(hi.length); // => 2
const letter = 'e\u0301';
console.log(letter); // => 'é'
console.log(letter.length); // => 2
TypeScript
복사
•
자바스크립트에서 문자열은 항상 코드유닛의 조합이라 생각해야한다. smile 이모지의 length가 2가 나온것 처럼
JS에서 Escape sequences
// 16진수
const str = '\x4A\x61vaScript';
console.log(str); // => 'JavaScript'
const reg = /\x4A\x61va.*/;
console.log(reg.test('JavaScript')); // => true
// 유니코드
const str = 'I\u0020learn \u0055nicode';
console.log(str); // => 'I learn Unicode'
const reg = /\u0055ni.*/;
console.log(reg.test('Unicode')); // => true
TypeScript
복사
문자열 비교
const firstStr = 'hello';
const secondStr = '\u0068ell\u006F';
console.log(firstStr === secondStr); // => true
TypeScript
복사
const str1 = 'ça va bien';
const str2 = 'c\u0327a va bien';
console.log(str1); // => 'ça va bien'
console.log(str2); // => 'ça va bien'
console.log(str1 === str2); // => false
TypeScript
복사
•
보이는건 같아도 실제 데이터는 다른형태이다
const str1 = 'ça va bien';
const str2 = 'c\u0327a va bien';
console.log(str1.normalize() === str2.normalize()); // => true
console.log(str1 === str2); // => false
TypeScript
복사
문자열 길이
const str = 'cat\u{1F639}';
console.log(str); // => 'cat😹'
console.log(str.length); // => 5
TypeScript
복사
•
surrogate pairs가 존재할때 길이는 unexpected behavior를 가지고 온다.
const str = 'cat\u{1F639}';
console.log(str); // => 'cat😹'
console.log([...str]); // => ['c', 'a', 't', '😹']
console.log([...str].length); // => 4
TypeScript
복사