Base36 변환기 사용 방법
- 입력 · 텍스트에 텍스트를 입력하세요. UTF-8 바이트가 인코딩되어 출력 · Base36에 결과가 나타납니다.
- 출력 아래 대소문자에서 소문자나 대문자를 고르세요. 어느 쪽이든 디코딩 결과는 같습니다.
- 숫자를 변환하려면 변환 전을 정수 (큰 수) 로 설정하고 10진수 값을 입력하세요. 변환 후를 바꿨다면 다시 Base36으로 설정하세요.
- 디코딩하려면 방향 전환에서 Base36 → 텍스트를 누르거나, 10진수를 얻으려면 변환 후를 정수 (큰 수) 로 설정하세요.
Base36과 10진수 사이의 변환
Base36은 0–9에 이어 a–z로 수를 세므로 a는 10, z는 35입니다. 각 자리는 오른쪽 자리의 36배 값을 가집니다.
| Base36 | 10진수 | 비고 |
|---|---|---|
z | 35 | 한 자리 중 가장 큰 수 |
10 | 36 | |
zz | 1295 | 35 × 36 + 35 |
1000 | 46656 | 36³ |
21i3v9 | 123456789 | |
2gosa7pa2gv | 9007199254740991 | JavaScript의 Number.MAX_SAFE_INTEGER |
3w5e11264sgsf | 18446744073709551615 | 2^64 − 1 |
변환기는 BigInt로 동작하므로 64비트와 128비트 값도 정확하게 나옵니다. 입력 한도는 64 KB로, 어떤 ID보다도 훨씬 큽니다.
Base36이 쓰이는 곳
Base36은 짧아야 하고 대소문자를 바꾸는 시스템을 통과해야 하는 식별자에 잘 맞습니다. 일부 소프트웨어가 소문자로 바꾸는 URL, 대소문자를 구분하지 않는 파일 시스템, 소리 내어 읽거나 종이를 보고 입력하는 코드가 그렇습니다. Reddit의 게시물과 댓글 ID가 한 예입니다. 또한 대부분의 프로그래밍 언어는 라이브러리 없이 Base36 수를 읽을 수 있습니다.
다른 방식과 비교하면 Base36은 대소문자 무관함을 얻는 대신 밀도를 조금 포기합니다. 무작위 16바이트는 Base36으로 24자나 25자, Base62로 21자나 22자, hex로 32자입니다. Base62는 더 짧지만 대소문자를 구분하고, Base32도 대소문자를 구분하지 않지만 알파벳을 5비트 묶음에 고정하고 패딩을 더합니다.
텍스트, 바이트, 앞쪽의 0
텍스트와 기타 바이트의 경우 변환기는 입력을 하나의 빅 엔디언 수로 읽고 그 수를 36진법으로 씁니다. Hello는 바이트 48 65 6c 6c 6f이고, 수로는 310939249775, Base36으로는 3yud78mn입니다. 앞쪽의 0 바이트는 순수한 수에서는 사라지므로 각각 숫자 0으로 씁니다. 바이트 00 0a는 0a로 인코딩됩니다.
정수 입력에는 앞쪽 0 문제가 없습니다. 10진수에는 잃어버릴 앞쪽 0 바이트가 없기 때문입니다.
JavaScript와 Python에서 Base36
두 언어 모두 수를 기본으로 변환할 수 있습니다.
(255).toString(36); // '73'
parseInt("73", 36); // 255
(2n ** 64n - 1n).toString(36) // '3w5e11264sgsf'
BigInt는 36진법으로 출력할 수는 있지만 파서가 없고, parseInt는 2^53을 넘으면 정밀도를 잃습니다. 짧은 반복문으로 해결할 수 있습니다.
function parseBase36(s) {
let n = 0n;
for (const ch of s.toLowerCase()) n = n * 36n + BigInt(parseInt(ch, 36));
return n;
}
parseBase36("3w5e11264sgsf"); // 18446744073709551615n
Python의 int()는 진법을 인자로 받고 크기에 상관없이 동작합니다. int("3w5e11264sgsf", 36)은 18446744073709551615를 돌려줍니다. 반대 방향의 내장 함수는 없지만, 알파벳 0123456789abcdefghijklmnopqrstuvwxyz와 divmod 반복문으로 만들 수 있습니다. 더 많은 패턴은 JavaScript와 Python 페이지에 있습니다.
자주 겪는 문제
- 값 안의
-,_, 공백에서 오류가 납니다. Base36에는 숫자와 영문자만 있습니다. 구분자를 지우거나, 여러 ID를 나누는 구분자라면 그 위치에서 값을 나누세요. - 디코딩한 텍스트가 깨집니다. 그 문자열은 인코딩된 텍스트가 아니라 숫자 ID였을 가능성이 높습니다. 변환 후를 정수 (큰 수) 로 설정해 수로 보세요.
- 스프레드시트나 JSON에서 마지막 자릿수가 조금 다릅니다. 어딘가에서 수가 double을 거쳤습니다. 큰 ID는 처음부터 끝까지 문자열로 다루세요.
자주 묻는 질문
Base36을 10진수로 바꾸려면 어떻게 하나요?
변환 전을 Base36으로, 변환 후를 정수 (큰 수) 로 설정한 뒤 Base36 값을 붙여넣으세요. zz는 1295가 되고, 3w5e11264sgsf는 부호 없는 64비트 최댓값인 18446744073709551615가 됩니다.
Base36은 대소문자를 구분하나요?
아니요. 대문자와 소문자는 같은 값이므로 ZZ와 zz는 둘 다 1295입니다. 그래서 Base36은 대소문자가 바뀌어도 살아남는 흔한 인코딩 중 가장 밀도가 높습니다.
JavaScript parseInt는 왜 다른 숫자를 돌려주나요?
parseInt(s, 36)은 double을 돌려주는데, double은 2^53까지만 정확합니다. parseInt("3w5e11264sgsf", 36)은 385만큼 틀린 18446744073709552000을 돌려줍니다. 이 페이지에 나온 것처럼 BigInt로 파싱하세요.
Hello의 Base36은 왜 parseInt('Hello', 36)과 다른가요?
인코더는 텍스트의 5바이트를 하나의 수로 바꾼 뒤 그 수를 36진법으로 씁니다(3yud78mn). parseInt는 H-e-l-l-o라는 글자를 Base36 숫자로 읽어 29234652를 돌려줍니다.