- UTF-8 codeert Unicode-punten in 1 tot 4 bytes, is compatibel met ASCII en geldig voor elke taal.
- Zelfsynchronisatie en validatie: De patronen 0/110/1110/11110 voorkomen overlappingen en maken het gemakkelijker om fouten te detecteren.
- Web en systemen: meta-tekenset, uitgebreide ondersteuning en eenvoudige conversie op Windows/macOS/Linux.
Als u dit artikel vandaag leest en geen vreemde symbolen ziet, dan komt dat door UTF-8.Dankzij deze codering kunnen letters, accenten, technische symbolen en zelfs emoji's in elke moderne browser, elk besturingssysteem en elke e-mailclient op dezelfde manier worden weergegeven. Het is de meest wijdverspreide standaard op het web en de basis van digitale communicatie zoals wij die kennen.
Wanneer een apparaat tekst weergeeft, verwerkt het eigenlijk getallen.Deze nummers zijn codepunten die gedefinieerd zijn door de Unicode-standaard en om ze om te zetten in bytes die via het netwerk reizen of in een bestand worden opgeslagen, we maken een transformatie: UTF-8In de volgende regels leest u wat het is, hoe het werkt, waarom het is opgezet, welke voordelen en beperkingen het heeft en hoe u veelvoorkomende fouten kunt vermijden.
Wat is UTF-8?
UTF-8 (8-bit Unicode Transformation Format) is een manier om Unicode-codepunten om te zetten in reeksen bytes.Het belangrijkste kenmerk is dat het gebruik maakt van variabele lengte: Sommige tekens nemen 1 byte in beslag, terwijl andere 2, 3 of 4 bytes in beslag nemen. Dit betekent dat Teksten met eenvoudige Latijnse karakters zijn compact, maar elk teken uit het Unicode-repertoire kan ook worden weergegeven.
Het is volledig compatibel met ASCII:De eerste 128 tekens (U+0000 tot U+007F) zijn gecodeerd als één byte, identiek aan 7-bits ASCII. Dit vergemakkelijkte de overgang van oudere systemen. en verklaart veel van het succes ervan in de internet-, e-mail- en IETF-protocollen.
UTF-8 onderscheidt zich door zijn robuustheid: bevat synchronisatiebits waarmee het begin van elk symbool betrouwbaar kan worden geïdentificeerd. Deze zelfsynchronisatie-eigenschap maakt gemakkelijk te detecteren of een sequentie "eruitziet" als UTF-8, iets wat erg handig is in tools en parsers.
Unicode: de basis van alles
Unicode is de universele standaard die aan elk teken een uniek nummer toekent., ongeacht taal, platform of applicatie. Dat nummer heet codepunt en wordt meestal hexadecimaal geschreven in het formaat U+XXXX (of meer cijfers indien nodig).
Bv De hoofdletter “A” is U+0041In HTML kunnen we er ook naar verwijzen als A. Uw computer "denkt" aan A niet als een letter, maar als het getal 65, en vervolgens bepaalt de codering (bijvoorbeeld UTF-8) hoe dat getal in bytes moet worden weergegeven.
Als u wilt controleren hoe Unicode wordt vertaald naar tekens op uw pcIn Windows kunt u de Alt-toets ingedrukt houden en de decimale numerieke code op het numerieke toetsenbord typen: bijvoorbeeld: Alt+65 retourneert “A” (zien volledige lijst met Alt-codes). Het is een klassieke sneltoets die laat zien hoe de codes ten grondslag liggen aan de tekens die u ziet.
Een stukje geschiedenis: hoe UTF-8 ontstond
UTF-8 werd op 2 september 1992 bedacht door Ken Thompson op basis van de criteria van Rob Pike.Beide hebben het in het besturingssysteem geïmplementeerd Plan 9 van Bell Labs en presenteerde het officieel in USENIX (San Diego, januari 1993)Tijdens de standaardisatie, gesponsord door X/Open Joint Internationalization Group (XOJIG), Het kreeg namen als FSS/UTF en UTF-2 totdat het bekend werd als UTF-8.
Het ontwerp loste praktische problemen op dat eerdere pogingen tot universele codering het volgende hadden: ASCII-compatibiliteit, zelfsynchronisatie, afwezigheid van overlappingen tussen bytes en gemakkelijke foutdetectie. Door dit evenwicht is het de facto de standaard van het web geworden..
Hoe UTF-8 onder de motorkap werkt
UTF-8 groepeert tekens volgens de bytes die nodig zijn om ze te coderen.Het aantal bytes is uitsluitend afhankelijk van het Unicode-codepunt en volgt bitpatronen die de lengte van de reeks aangeven.
- 1 byte (U+0000 tot U+007F): ASCII-tekens. Formaat:
0xxxxxxxDe meest significante bit is 0, wat garandeert directe compatibiliteit met ASCII. - 2 bytes (U+0080 tot U+07FF): Formaat
110yyyyy 10xxxxxx. Het wordt gebruikt voor de meeste Europese alfabetten met diakritische tekens en andere alfabetten, zoals het Grieks, Cyrillisch, Hebreeuws en Arabisch.. - 3 bytes (U+0800 tot U+FFFF): Formaat
1110zzzz 10yyyyyy 10xxxxxx. Inclusief het meertalige basisplan (BMP), met CJK (Chinees, Japans, Koreaans), technische symbolen en meest gebruikte tekens. - 4 bytes (U+10000 tot U+10FFFF): Formaat
11110uuu 10uuzzzz 10yyyyyy 10xxxxxx. Vertegenwoordigt de aanvullende vlakken: geavanceerde wiskundige symbolen, historische geschriften, minder gebruikelijke ideografische symbolen, etc.
De sleutel tot zelfsynchronisatie zit in de headerbits: 0 voor ASCII; 110 voor twee bytes; 1110 voor drie; 11110 voor vier. De voortzettingsbytes Ze beginnen altijd met 10. Dankzij dat, Een voortzettingsbyte kan nooit een startbyte lijken, en een geldige reeks kan nooit een subreeks zijn van een langere reeks (non-overlapprincipe).
Equivalentie met UTF-16 en surrogaatparen
UTF-16 vertegenwoordigt BMP-codepunten met een eenheid van 16 bits en punten boven U+FFFF met vervangende paren in het bereik D800–DFFF. In plaats daarvan, UTF-8 codeert altijd echte codepunten, geen UTF-16-eenheden, waardoor verwarring met vervangers wordt voorkomen.
Historisch gezien stonden sommige ontwerpen toe 5 of 6 bytes in UTF-8 om een breder bereik te bestrijken, maar Unicode en RFC 3629 beperken UTF-8 tot maximaal 4 bytes.ISO/IEC overwoog ooit ruimere opties, maar deze maken geen deel meer uit van de huidige norm.
Praktisch voorbeeld: de ñ
Het teken “ñ” heeft code punt U+00F1, dat binnen het bereik van twee bytes valt. Volgens het patroon wordt het gecodeerd als 110xxxxx 10xxxxxx. De UTF-8-weergave is 0xC3 0xB1Decoderen is het omgekeerde proces: de bruikbare bits worden gelezen en het oorspronkelijke code punt wordt gereconstrueerd.
Voordelen en beperkingen van UTF-8
Belangrijkste voordelen:
- ASCII-ondersteuning: ASCII-teksten zijn geldig in UTF-8 zonder wijzigingen.
- Universeel: kan elk Unicode-teken voorstellen, inclusief technische symbolen en emoji's.
- Efficiëntie in Latijnse teksten: bij gebruik van 1 byte voor ASCII, bespaart ruimte in vergelijking met UTF-16 in veel westerse talen.
- Zelfsynchronisatie en detectie: bitpatronen maken het mogelijk karakterbegin detecteren en sequenties eenvoudig valideren.
Beperkingen en afwegingen:
- CJK-teksten nemen meer ruimte in beslag dan UTF-16-teksten, waarbij veel van die tekens in 2 vaste bytes passen.
- Berekeningskosten: omdat de lengte variabel is, kunnen sommige bewerkingen (bijvoorbeeld “ga naar teken n”) vereisen dat je vanaf het begin doorgaaten bepaalde taken kunnen sneller zijn in UTF-16/UTF-32.
BOM (Byte Order Mark) in UTF-8
UTF-8 heeft geen BOM nodig omdat de bytevolgorde de betekenis van de waarden niet verandert (de kleinste eenheid is de byte). Toch, Er is een optionele BOM, het teken U+FEFF gecodeerd als EF BB BF aan het begin van een bestand of stream, wat kan worden gebruikt om aan te geven dat het om Unicode/UTF-8 gaat.
Goede praktijken:Als het bij het opstarten verschijnt, accepteren sommige systemen het, terwijl andere het letterlijk behandelen. Bij concatenaties is het raadzaam om tussenliggende BOM's te eliminerenHet is niet verplicht om het op te nemen en het nut ervan in UTF-8 is beperkt vergeleken met UTF-16/UTF-32, waar het wel de eindeloosheid.
Typische codeerfouten en hoe ermee om te gaan
Een robuuste UTF-8-decoder moet misvormde sequenties afwijzen of vervang ze door U+FFFD (VERVANGEND KARAKTER) of meld een fout. De meest voorkomende fouten zijn:
- Afgeknotte sequenties: een multibyte inleidende byte zonder voldoende voortzettingen.
- Losse voortzettingsbytes: verschijnen
10xxxxxxzonder een geldige leadbyte. - Overlengtes: codering met meer bytes dan nodig; bijvoorbeeld, proberen een ASCII te coderen met 2 bytes (
0xC0y0xC1zijn ongeldig). - Verboden lengtes: begint met het voorstellen van 5 of 6 bytes (
0xF8-0xFDzijn niet geldig in standaard UTF-8). - Waarden buiten het Unicode-bereik: niet ondersteund boven U+10FFFF; bepaalde waarden (
0xF5-0xF7(als begin) zijn ongeldig. - UTF-16 surrogaatparen:
D800–DFFFzijn geen geldige code punten in Unicode; ze mogen niet in UTF-8 gecodeerd worden weergegeven.
Wanneer u de tekens “�” op het scherm ziet, is er hoogstwaarschijnlijk sprake van een coderingsfout of een bestand dat in een andere codepagina is opgeslagen. De oplossing is om forceer end-to-end UTF-8 (bestand, server, database, HTTP-headers).
UTF-8 op het web en in e-mail
Een HTML-pagina mag slechts één codering declarerenDe aanbevolen methode, voor compatibiliteit en bereik, is UTF-8. Voeg de metatag zo vroeg mogelijk in de header toe:
<meta charset="UTF-8">
Plaats het aan het begin van de zodat de browser het kan lezen voordat het document wordt verwerkt. Dit voorkomt inconsistenties en gebroken tekens. De acceptatie van UTF-8 op het web is overweldigend, wordt het door de overgrote meerderheid van de huidige sites gebruikt.
In e-mail, UTF-8 wordt breed ondersteund en aanbevolen door organisaties zoals het Internet Mail Consortium. Configureer e-mailclients voor gebruik van UTF-8 vermindert problemen bij het uitwisselen van berichten met anderstaligen.
UTF-8, UTF-16 en UTF-32: wat is het verschil?
UTF-8: variabele lengte in 8-bits eenheden; ideaal voor webZeer efficiënt met ASCII en westerse talen. Uitstekende compatibiliteit en foutdetectie.
UTF-16: variabele lengte in 16-bits eenheden; gebruikt surrogaatparen voor U+10000 en hoger. Het is meestal voordelig wanneer niet-ASCII-tekens overheersen, en wordt gebruikt in veel API's en platforms (bijv. Windows draait standaard in UTF-16).
UTF-32: vaste lengte van 32 bits per teken; zeer eenvoudig te indexeren, maar neemt veel ruimte in beslag. Het is gereserveerd voor gevallen waarbij de grootte ondergeschikt is aan de eenvoud van de verwerking.
Incompatibele varianten: CESU-8 en “Modified UTF-8”
CESU-8 codeert UTF-16-eenheden direct (inclusief surrogaatparen) in plaats van codepunten te coderen, daarom verschilt het van de standaard UTF-8 voor personages boven U+FFFF. Sommige historische platforms gebruikten het: Oracle 8 bood het aan met de alias UTF8 en vanaf Oracle 9 werd de UTF-8-standaard toegevoegd met een andere alias. Java en Tcl hebben CESU-8 gebruikt in bepaalde contexten.
Gewijzigde UTF-8 (bijvoorbeeld in Java-omgevingen) vertegenwoordigt het NUL-teken (U+0000) als 0xC0 0x80 in plaats van 0x00. Vermijd nulbytes in C-strings maar het voldoet niet aan de UTF-8-standaard. Veel implementaties van deze "aangepaste" versie voldoen aan CESU-8.
UTF-8 op Windows en API's: codepagina's en conversie
Windows werkt intern in UTF-16 (WCHAR), maar sinds Windows 10 versie 1903 kun je UTF-8 forceren als de procescodepagina via het applicatiemanifest (eigenschap activeCodePage). Hierdoor kan oudere code die gebruikmaakt van “-A” API’s, gemakkelijker werken via UTF-8.
API's -A versus -W: de -A afhankelijk van de ANSI-codepagina geconfigureerd (kan CP_UTF8 zijn), terwijl de -W zij maken gebruik van UTF-16Om samen te werken, MultiByteToWideChar y WideCharToMultiByte kunt u converteren tussen UTF-8 en UTF-16; toepassingen CP_UTF8 en, indien van toepassing, MB_ERR_INVALID_CHARS om invoerfouten te detecteren.
UTF-8 wordt ondersteund door moderne browsers (Chrome, Firefox, Safari, Edge, Opera en recente versies van Internet Explorer) en met de meeste besturingssystemen (Windows, Linux, macOS, Android, iOS). Behalve zeer oude software, je zou geen problemen moeten hebben.
Hoe bestanden naar UTF-8 converteren
In Windows (Kladblok): Open het bestand, ga naar “Bestand > Opslaan als…” en kies onder “Codering” voor UTF-8Sla het bestand op onder een nieuwe naam als u de originele naam wilt behouden.
Op macOS (Teksteditor): Selecteer in “Teksteditor > Voorkeuren > Openen en opslaan” Unicode (UTF-8) bij het opslaan. Exporteer het bestand vervolgens met die optie ingeschakeld.
Op Linux: met de terminal kunt u gebruiken iconv. Bijvoorbeeld: iconv -f <codificación_origen> -t UTF-8 <entrada> -o <salida>. Controleer later dat de applicatie die het gebruikt ook UTF-8 verwacht.
Hoe weet ik of een bestand in UTF-8 is? Veel moderne editors geven dit aan in de statusbalk. Als u vreemde tekens ziet zoals "�", onjuiste accenten of een onjuist weergegeven "ñ/ç", Controleer de bestandscodering en de editor-/server-/DB-instellingen.
Goede praktijken om verrassingen te voorkomen
Verklaar UTF-8 zo snel mogelijk in HTML- en HTTP-headers. Lijnt de codering uit over de gehele stack (bronbestanden, sjablonen, database en verbinding). Vermijd het mengen van coderingen op één pagina of in één stroom en gebruik hulpmiddelen die invoer valideren/normaliseren.
Voor integraties en API's, geef altijd de codering op in headers (Content-Type: application/json; charset=UTF-8bijvoorbeeld). Test met meertalige gegevens (accenten, CJK, emoji's) om zwakke punten te detecteren vóór de productie.
UTF-8 won omdat het een evenwicht biedt tussen compatibiliteit, efficiëntie en bereik.Het is de meest praktische manier om ervoor te zorgen dat een tekst intact blijft tussen culturen, systemen en toepassingen, ongeacht of er accenten, technische symbolen of niet-Latijnse schriften in voorkomen.
Inhoud
- Wat is UTF-8?
- Unicode: de basis van alles
- Een stukje geschiedenis: hoe UTF-8 ontstond
- Hoe UTF-8 onder de motorkap werkt
- Voordelen en beperkingen van UTF-8
- BOM (Byte Order Mark) in UTF-8
- Typische codeerfouten en hoe ermee om te gaan
- UTF-8 op het web en in e-mail
- UTF-8, UTF-16 en UTF-32: wat is het verschil?
- Incompatibele varianten: CESU-8 en “Modified UTF-8”
- UTF-8 op Windows en API's: codepagina's en conversie
- Echte compatibiliteit: browsers en systemen
- Hoe bestanden naar UTF-8 converteren
- Goede praktijken om verrassingen te voorkomen