Skip to main content

Encoder/decoder for UTF-64, a URL-safe encoding for JSONish strings

Project description

utf-64

A terse, human-readable, URL-safe encoding for JSONish strings.

JS Python Go Rust

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

utf64-1.0.3.tar.gz (4.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

utf64-1.0.3-py3-none-any.whl (3.9 kB view details)

Uploaded Python 3

File details

Details for the file utf64-1.0.3.tar.gz.

File metadata

  • Download URL: utf64-1.0.3.tar.gz
  • Upload date:
  • Size: 4.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.31.0

File hashes

Hashes for utf64-1.0.3.tar.gz
Algorithm Hash digest
SHA256 099439f00d85177b804a4da98e02f0a23709bf843a64f9cac31c72da9bae7b05
MD5 b4a2b9dbc3909b6e9cf1813c133b65ce
BLAKE2b-256 3d85d116ffba6a82d5e42c66aa5dc5121109d16449e6cacf031c84084a08ee30

See more details on using hashes here.

File details

Details for the file utf64-1.0.3-py3-none-any.whl.

File metadata

  • Download URL: utf64-1.0.3-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

Hashes for utf64-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 52447f6f1ce9b4bbe0cfc5f40ba002220c25887fd4816f72e964e245931e72c9
MD5 b047d0140f0e0f000a00040600b00b83
BLAKE2b-256 e1b99113e9e2bb174b5cda71133da8327d2bc6daa0315e89c132342da32ee9be

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page