Encoder/decoder for UTF-64, a URL-safe encoding for JSONish strings
Project description
A terse, human-readable, URL-safe encoding for JSONish strings.
Overview
Use this when you need to encode a string to make it URL-safe, but you also want to keep it as small and readable as possible (unlike base64). For example:
| Input string | base64 | utf64 |
|---|---|---|
| Hello | SGVsbG8= | YHello |
| "Hello!" | IkhlbGxvISI= | AYHelloGA |
| {"Hello":"world"} | eyJIZWxsbyI6IndvcmxkIn0= | MAYHelloAFAworldAN |
I made this because I wanted to build a web API with a nice JSON schema that could also be cached by a CDN. To make it cacheable, I had to use the GET method; but GET can't (portably) have a request body, so this means all the API parameters need to be packed into the URL. UTF-64 is a fire-and-forget way to solve this problem.
UTF-64 uses the very permissive 0BSD licence so you can freely use this code & spec anywhere. I picked 0BSD as it seems to be the "public domain equivalent" most widely accepted by corporations, e.g. Google has a specific exception permitting the use of 0BSD.
Installation & usage
JavaScript
npm install utf64
import * as utf64 from "utf64";
console.log(utf64.encode("Hello!"));
console.log(utf64.decode("YHelloG"));
Python
pip install utf64
import utf64
print(utf64.encode("Hello!"))
print(utf64.decode("YHelloG"))
Go
go get utf64.moreplease.com
package main
import (
"fmt"
"utf64.moreplease.com"
)
func main() {
fmt.Println(utf64.Encode("Hello!"))
result, err := utf64.Decode("YHelloG")
if err != nil {
panic(err)
}
fmt.Println(result)
}
Rust
Kindly contributed by Mark Musante (@mjmusante)
cargo add utf64
use utf64::*;
fn main() {
println!("{}", "Hello!".encode_utf64().unwrap());
match "YHelloG".decode_utf64() {
Ok(result) => println!("{result}"),
Err(e) => panic!("{e}"),
}
}
Command-line tool
The JS package includes a utf64 command-line tool:
npm install -g utf64
utf64 "Hello\!"
utf64 -d YHelloG
Specification
Output is encoded using base64url-compatible characters: _ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-
| utf64 | Decoded as |
|---|---|
_ |
As-is |
a to z |
As-is |
0 to 9 |
As-is |
ABCDEFGHIJKLMNOPQRSTU |
Mapped to: "',.;:!?()[]{}#=+-*/\ |
V |
Newline |
W |
Space |
X |
Prefix for Unicode 0-63. For example, "Xk" is "%" (U+0025) |
Y |
Prefix for Unicode 64-127. For example, "Y_" is "@" (U+0040) |
Z |
Prefix for Unicode 128+. The following characters are interpreted as UTF-8, reduced to 6-bit bytes by stripping the redundant top two bits. For example, "ZhBr" is "€" (UTF-8 [11]100010 [10]000010 [10]101100) |
See test.json for tests that (hopefully) cover all the edge cases, for both valid and invalid encodings.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file utf64-1.0.2.tar.gz.
File metadata
- Download URL: utf64-1.0.2.tar.gz
- Upload date:
- Size: 6.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.31.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a2410ed485a98bbc327029c342c1ce15503ef1c38bc5de15b5a4f09a9c27a33
|
|
| MD5 |
be17dd52d1517aa4fee8a79e60318897
|
|
| BLAKE2b-256 |
3bb1ad418b75b4ca407dbafdf4dc266c979704b6a848f168bfefb7c6b330dab8
|
File details
Details for the file utf64-1.0.2-py3-none-any.whl.
File metadata
- Download URL: utf64-1.0.2-py3-none-any.whl
- Upload date:
- Size: 3.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.31.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d5dabd04b7bec648890ed820fd7f8d800e1fa053c2c74f60ea0d198d53e6e79
|
|
| MD5 |
ab32a9e749b12a41a2c845cefda28cbc
|
|
| BLAKE2b-256 |
69d725aff0fd0cde0e7f18c8678e4a675a9a408c49230ef6184bcfa9cf795b0b
|