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
EncodeRuneun slice prea mic (de exemplumake([]byte, 1)pentru ș): programul se oprește cupanic. Foloseșteutf8.UTFMaxsauAppendRune. - Scrii
byte(r)pentru un caracter cu diacritice: păstrezi doar ultimii 8 biți și obții alt caracter. FoloseșteEncodeRune,AppendRunesaustring(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().