Om UTF-8 naar Base64URL te converteren, volg je 4 stappen: (1) codeer tekst naar UTF-8-bytes, (2) pas standaard Base64 toe, (3) wissel + → - en / → _, (4) verwijder afsluitende =-padding. Dit produceert een URL-veilige string volgens RFC 4648, die wordt gebruikt in JWT’s en API-headers.
Standaard Base64 vs. Base64URL
| Teken | Standaard Base64 | Base64URL | Waarom |
|---|---|---|---|
| 62e teken | + |
- |
+ betekent spatie in URL’s |
| 63e teken | / |
_ |
/ is een padscheidingsteken in URL’s |
| Padding | = vereist |
Weggelaten | = wordt %3D in URL’s |
| URL-veilig | Nee | Ja | Direct bruikbaar in querystrings en bestandsnamen |
Volgens RFC 4648 §5 zorgt dit “URL- en bestandsnaamveilige alfabet” voor compatibiliteit tussen systemen.

Het conversieproces in 4 stappen
| Stap | Bewerking | Voorbeeld (“Hello”) |
|---|---|---|
| 1 | UTF-8-tekst → bytes | H e l l o → byte-array |
| 2 | Bytes → standaard Base64 | SGVsbG8= |
| 3 | Wissel + → -, / → _ |
Geen wijziging nodig hier |
| 4 | Verwijder afsluitende =-padding |
SGVsbG8 |
Base64-codering vergroot de gegevensgrootte met ongeveer ~33% volgens Wikipedia.

Unicode- en emoji-afhandeling
Volgens NextUtils is Base64 codering, geen encryptie — het verplaatst gegevens via tekstkanalen. Om Unicode/emoji correct te verwerken zonder corruptie (“Mojibake”), gebruik je altijd TextEncoder om eerst naar UTF-8-bytes te converteren.
| Invoer | Zonder TextEncoder | Met TextEncoder |
|---|---|---|
Hello 世界! 🌍 |
Mojibake / TypeError | Correcte Base64URL |
Codevoorbeelden
JavaScript (browser) — Unicode-veilig
function toBase64Url(str) {
const bytes = new TextEncoder().encode(str);
const base64 = btoa(String.fromCharCode(...bytes));
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
Python 3 — Standaardbibliotheek
Volgens AskPython:
import base64
data = "Hello 世界! 🌍"
encoded = base64.urlsafe_b64encode(data.encode('utf-8')).decode('utf-8').rstrip('=')
print(encoded)
Node.js — Buffer-conversie
const str = "API_Payload_Data";
const base64url = Buffer.from(str, 'utf8')
.toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
Probleemoplossing: Padding-fouten
| Fout | Oorzaak | Oplossing |
|---|---|---|
binascii.Error: Incorrect padding |
Ontbrekende =-padding |
Voeg = toe tot de lengte een veelvoud van 4 is |
TypeError bij atob() |
Niet-ASCII-tekens | Gebruik eerst TextEncoder |
| Onleesbare uitvoer | UTF-8-codering overgeslagen | Altijd naar bytes coderen vóór Base64 |
Volgens AskPython bereken je de ontbrekende padding als volgt: padding_needed = (4 - len(data) % 4) % 4, en voeg je dat aantal =-tekens toe.
Gebruiksscenario’s: JWT en Data-URI’s
JWT (JSON Web Token) structuur
| Onderdeel | Inhoud | Codering |
|---|---|---|
| Header | Algoritme + tokentype | Base64URL |
| Payload | Claims (gebruikersgegevens, vervaldatum) | Base64URL |
| Handtekening | HMAC- of RSA-handtekening | Base64URL |
JWT’s beginnen vaak met eyJ — de Base64URL-codering van { ( openingsaccolade van JSON).

Base64 vs. Base64URL per gebruiksscenario
| Gebruiksscenario | Codering | Padding |
|---|---|---|
| JWT-tokens | Base64URL | Weggelaten |
| Data-URI’s (ingesloten afbeeldingen) | Standaard Base64 | Vereist |
| HTTP Basic Auth | Standaard Base64 | Vereist |
| URL-queryparameters | Base64URL | Weggelaten |
Conclusie
4 stappen: UTF-8-bytes → Base64 → wissel +/ naar -_ → verwijder padding. Gebruik TextEncoder in JavaScript, base64.urlsafe_b64encode() in Python, Buffer in Node.js. Volg RFC 4648 voor compatibiliteit tussen systemen. Base64URL is codering, geen encryptie — gebruik AES-256 of TLS voor beveiliging.
Veelgestelde vragen
Is Base64URL hetzelfde als encryptie?
Nee. Base64URL is omkeerbare codering — iedereen kan het decoderen zonder een sleutel. Gebruik AES-256 of TLS/SSL voor het beveiligen van gevoelige gegevens.
Waarom faalt Base64URL in een standaard Base64-decoder?
Standaard decoders verwachten +, / en =-padding. Base64URL gebruikt -, _ en laat padding weg. Keer de tekenwijzigingen om en herstel de padding vóór het decoderen.
Waarom wordt padding weggelaten in JWT’s?
Het teken = wordt %3D in URL’s, waardoor strings langer en moeilijker leesbaar worden. RFC 4648 staat weglating toe omdat decoders de oorspronkelijke lengte kunnen reconstrueren zonder padding-markeringen.

Geef een reactie