(JS) char <> code <> hex / unicode 공백 / Unpack
hex
1
2
(65).toString(16) // 41
"A".charCodeAt().toString(16) // 41
code to char
1
String.fromCharCode(0x41) // "A"
JS는 유니코드가 16bit charset이었을 때 개발되었기 때문에 JS에서 한 문자는 기본적으로 2 bytes 유니코드다.
그러나 \x??
로 직접 입력하는 경우 1 byte 씩 문자로 인식한다. 2 bytes 유니코드 문자를 사용하려면 \u
를 사용해야 한다.
1
2
3
4
"\uc548"
"안"
"\xc5\x48"
"ÅH"
BMP를 넘어가는 경우(U+10000 이상) surrogate halves가 총 4 bytes이므로 length
를 2로 인식한다. 그래서 UTF-16이라기 보다는 UCS-2에 가까우나 이를 한 문자로 표시하기 때문에 완전히 UCS-2같지는 않다.
1
2
3
4
5
6
7
8
9
10
11
"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으로 되돌아간다.
유니코드 공백 문자 집합
1
\s == [\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]
JS unpacking
eval부터 끝까지 복사한다음, 브라우저 개발자 도구에서 console탭에 붙여넣기하고 eval을 console.log()
또는 js alert()
로 바꾼다.
eval()
setTimeout(), setinterval()
은 함수 인수를 취하지만, eval()
처럼 문자열을 받아 실행할 수도 있다. 그러나 문자열 인수를 넘기는 것은 보안, 성능상 좋지 않다.
This post is licensed under CC BY 4.0 by the author.