unicode/utf8.EncodeRune în Go

Caractere Unicode și UTF-8 (unicode, unicode/utf8) Go 1.0 (AppendRune din Go 1.18)

EncodeRune scrie un caracter în UTF-8 într-un []byte, AppendRune îl adaugă la final, iar RuneLen spune câți octeți ocupă.

Sintaxă
func EncodeRune(p []byte, r rune) int
func AppendRune(p []byte, r rune) []byte
func RuneLen(r rune) int

Ce face unicode/utf8.EncodeRune

utf8.EncodeRune(p, r) scrie octeții UTF-8 ai caracterului r la începutul lui p și returnează câți octeți a scris. p trebuie să aibă loc suficient: utf8.UTFMax (4) octeți ajung pentru orice caracter. Dacă nu ajung, programul se oprește cu panic.

utf8.AppendRune(p, r) adaugă octeții caracterului la sfârșitul lui p și returnează slice-ul mărit, ca append. Este varianta mai comodă.

utf8.RuneLen(r) returnează câți octeți ocupă caracterul în UTF-8 (1–4) sau -1 dacă valoarea nu este un caracter valid. Caracterele invalide sunt scrise de EncodeRune și AppendRune ca RuneError (�).

Parametri

Parametru Descriere
p Slice-ul în care se scrie / la care se adaugă.
r Caracterul.

Ce returnează

EncodeRune: numărul de octeți scriși. AppendRune: slice-ul mărit. RuneLen: numărul de octeți sau -1.

Exemple

Exemplul 1: Câți octeți ocupă fiecare caracter

0xD800 nu este un caracter valid: RuneLen dă -1, iar EncodeRune scrie în loc caracterul de înlocuire � (ef bf bd).

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	for _, r := range []rune{'a', 'ș', '€', '😀', 0xD800} {
		buf := make([]byte, utf8.UTFMax)
		n := utf8.EncodeRune(buf, r)
		fmt.Printf("%-8U RuneLen=%2d  UTF-8: % x\n", r, utf8.RuneLen(r), buf[:n])
	}
}

Rezultat

U+0061   RuneLen= 1  UTF-8: 61
U+0219   RuneLen= 2  UTF-8: c8 99
U+20AC   RuneLen= 3  UTF-8: e2 82 ac
U+1F600  RuneLen= 4  UTF-8: f0 9f 98 80
U+D800   RuneLen=-1  UTF-8: ef bf bd

Exemplul 2: AppendRune: construirea unui text din caractere

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	var b []byte
	for _, r := range []rune{'Ț', 'a', 'r', 'ă'} {
		b = utf8.AppendRune(b, r)
	}
	fmt.Println(string(b), len(b), "octeți")
}

Rezultat

Țară 6 octeți

Greșeli frecvente

  • Dai lui EncodeRune un slice prea mic (de exemplu make([]byte, 1) pentru ș): programul se oprește cu panic. Folosește utf8.UTFMax sau AppendRune.
  • Scrii byte(r) pentru un caracter cu diacritice: păstrezi doar ultimii 8 biți și obții alt caracter. Folosește EncodeRune, AppendRune sau string(r).

Comenzi înrudite

  • unicode/utf8.DecodeRuneInString: Citește primul (sau ultimul) caracter UTF-8 dintr-un text sau []byte și spune câți octeți ocupă.
  • unicode/utf8.RuneCountInString: Numără caracterele (rune) dintr-un text UTF-8; len() numără octeții, iar ă, î, ș, ț ocupă câte 2 octeți.
  • unicode/utf8.ValidString: Verifică dacă un text sau un []byte este UTF-8 valid și dacă o valoare rune este un caracter Unicode valid.
  • strings.Builder: Construiește eficient un text din multe bucăți: adaugi cu WriteString, WriteByte, WriteRune sau Write și obții rezultatul cu String().