"""
Base‑36 encoding/decoding in Python
---------------------------------------------
Base‑36 digits: 0–9, A–Z
Encoding:
- Convert string → bytes (UTF‑8)
- Convert bytes → big integer (base‑256)
- Convert big integer → base‑36 using built‑in base conversion
Decoding:
- Convert base‑36 → big integer
- Convert big integer → bytes (base‑256)
- Convert bytes → original UTF‑8 string
Python automatically supports arbitrary‑precision integers,
so the implementation is clean and efficient.
"""
BASE36_DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def encode_to_base36(text: str) -> str:
"""
Encode any UTF‑8 string into Base‑36.
"""
# Convert string → bytes
data = text.encode("utf-8")
# Convert bytes → big integer (base‑256)
n = 0
for b in data:
n = n * 256 + b
# Convert big integer → Base‑36
if n == 0:
return "0"
encoded = []
while n > 0:
n, rem = divmod(n, 36)
encoded.append(BASE36_DIGITS[rem])
return "".join(reversed(encoded))
def decode_from_base36(encoded: str) -> str:
"""
Decode Base‑36 text back into the original UTF‑8 string.
"""
encoded = encoded.upper()
# Convert Base‑36 → big integer
n = 0
for c in encoded:
n = n * 36 + BASE36_DIGITS.index(c)
# Convert big integer → bytes (base‑256)
if n == 0:
return ""
data = []
while n > 0:
n, rem = divmod(n, 256)
data.append(rem)
data.reverse()
return bytes(data).decode("utf-8")
def main():
text = "Hello Universe!"
encoded = encode_to_base36(text)
decoded = decode_from_base36(encoded)
print("Original:", text)
print("Base-36 encoded:", encoded)
print("Decoded:", decoded)
if __name__ == "__main__":
main()
"""
run:
Original: Hello Universe!
Base-36 encoded: LP4N024HJ1YVBVD84Y8TYQP
Decoded: Hello Universe!
"""