Ce face unicode/utf8.DecodeRuneInString
utf8.DecodeRuneInString(s) decodează primul caracter din s și returnează caracterul și numărul lui de octeți (1–4). DecodeRune face la fel pentru []byte. Variantele DecodeLastRuneInString și DecodeLastRune decodează ultimul caracter.
Dacă textul este gol, rezultatul este (utf8.RuneError, 0). Dacă primii octeți nu formează UTF-8 valid, rezultatul este (utf8.RuneError, 1): așa poți trece peste octetul greșit și continua. utf8.RuneError este caracterul de înlocuire U+FFFD (�).
Sunt utile când vrei doar primul sau ultimul caracter, fără să parcurgi tot textul, sau când parcurgi manual un []byte.
Parametri
| Parametru | Descriere |
|---|---|
s / p |
Textul sau octeții. |
Ce returnează
Caracterul (rune) și numărul de octeți pe care îi ocupă (size).
Exemple
Exemplul 1: Primul și ultimul caracter
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "Ștefănești"
r, n := utf8.DecodeRuneInString(s)
fmt.Printf("primul: %c, ocupă %d octet(i), restul: %s\n", r, n, s[n:])
r, n = utf8.DecodeLastRuneInString(s)
fmt.Printf("ultimul: %c, ocupă %d octet(i)\n", r, n)
r, n = utf8.DecodeRuneInString("")
fmt.Println(r == utf8.RuneError, n)
}
Rezultat
primul: Ș, ocupă 2 octet(i), restul: tefănești
ultimul: i, ocupă 1 octet(i)
true 0
Exemplul 2: Parcurgerea manuală a unor octeți, cu un octet invalid
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
date := []byte("Ț\xffă")
for len(date) > 0 {
r, n := utf8.DecodeRune(date)
if r == utf8.RuneError && n == 1 {
fmt.Printf("octet invalid: %#x\n", date[0])
} else {
fmt.Printf("%c ocupă %d octeți\n", r, n)
}
date = date[n:]
}
r, n := utf8.DecodeLastRune([]byte("Iași"))
fmt.Printf("ultimul din []byte: %c, %d\n", r, n)
}
Rezultat
Ț ocupă 2 octeți
octet invalid: 0xff
ă ocupă 2 octeți
ultimul din []byte: i, 1
Greșeli frecvente
- Verifici doar
r == utf8.RuneErrorca semn de eroare. Textul poate conține chiar caracterul �, valid; eroarea reală ester == RuneError && size == 1(sausize == 0pentru text gol).
Comenzi înrudite
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.EncodeRune: EncodeRune scrie un caracter în UTF-8 într-un []byte, AppendRune îl adaugă la final, iar RuneLen spune câți octeți ocupă.unicode/utf8.FullRune: FullRune verifică dacă octeții încep cu un caracter UTF-8 complet; RuneStart dacă un octet poate fi începutul unui caracter.strings.ToUpper: Returnează textul scris cu litere mari (ToUpper) sau mici (ToLower), inclusiv diacriticele.