unicode/utf8.DecodeRuneInString în Go

Citește primul (sau ultimul) caracter UTF-8 dintr-un text sau []byte și spune câți octeți ocupă.

Sintaxă
func DecodeRuneInString(s string) (r rune, size int)
func DecodeRune(p []byte) (r rune, size int)
func DecodeLastRuneInString(s string) (r rune, size int)
func DecodeLastRune(p []byte) (r rune, size int)

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.RuneError ca semn de eroare. Textul poate conține chiar caracterul �, valid; eroarea reală este r == RuneError && size == 1 (sau size == 0 pentru 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.