[JS] char <> code <> hex / unicode 공백 / Unpack
hex
(65).toString(16) // 41
"A".charCodeAt().toString(16) // 41
code to char
String.fromCharCode(0x41) // "A"
JS는 유니코드가 16bit charset이었을 때 개발되었기 때문에 JS에서 한 문자는 기본적으로 2 bytes 유니코드다.
그러나 `` \x??``로 직접 입력하는 경우 1 byte 씩 문자로 인식한다. 2 bytes 유니코드 문자를 사용하려면 `` \u``를 사용해야 한다.
```js
"\uc548"
"안"
"\xc5\x48"
"ÅH"
```
BMP를 넘어가는 경우(U+10000 이상) surrogate halves가 총 4 bytes이므로 ``length``를 2로 인식한다.
그래서 UTF-16이라기 보다는 UCS-2에 가까우나 이를 한 문자로 표시하기 때문에 완전히 UCS-2같지는 않다.
```js
"A" === "\u0041"
"\uD834\uDC06" // "𝀆" BMP를 넘어가는 경우.
"\uD834\uDC06".length // 2 한 문자지만 length는 2다.
String.fromCharCode(65586) // "2"
String.fromCharCode(65586).charCodeAt() // 50
String.fromCharCode(50) // "2"
// 65536(0x10000) 부터 쪼개지는게 아니라 다시 0으로 되돌아간다.
```
유니코드 공백 문자 집합
```js
\s == [\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]
```
JS unpacking
eval부터 끝까지 복사한다음,
브라우저 개발자 도구에서 console탭에 붙여넣기하고
eval을 ``js console.log()`` 또는 ``js alert()``로 바꾼다.
eval()
``js setTimeout(), setinterval()``은 함수 인수를 취하지만, ``js eval()`` 처럼 문자열을 받아 실행할 수도 있다.
그러나 문자열 인수를 넘기는 것은 보안, 성능상 좋지 않다.
'JS Stack > JS' 카테고리의 다른 글
[JS] ArrayBuffer와 DataView : TypedArray (0) | 2019.10.31 |
---|---|
[jQuery] checkbox의 check all 기능 구현하기 (0) | 2018.11.30 |
[JS] memoization, currying (0) | 2017.06.02 |
[JS] 함수 #2. Call pattern, 생성자 대안(함수형 패턴), 상속 (0) | 2017.05.31 |
[JS] 함수 #1. 유효범위(scope), callback, 클로저(closure), 접근 제어 (0) | 2017.05.31 |