unicode/utf8.ValidString în Go

Verifică dacă un text sau un []byte este UTF-8 valid și dacă o valoare rune este un caracter Unicode valid.

Sintaxă
func ValidString(s string) bool
func Valid(p []byte) bool
func ValidRune(r rune) bool

Ce face unicode/utf8.ValidString

utf8.ValidString(s) și utf8.Valid(p) returnează true dacă toți octeții formează caractere UTF-8 corecte. Datele citite din fișiere, din rețea sau tăiate greșit pot conține octeți invalizi; verifică-le înainte de a le salva într-o bază de date sau într-un JSON.

utf8.ValidRune(r) spune dacă valoarea numerică r poate fi un caracter Unicode: trebuie să fie între 0 și 0x10FFFF și să nu fie în zona rezervată U+D800–U+DFFF (surrogates).

Pentru a înlocui octeții invalizi, folosește strings.ToValidUTF8.

Parametri

Parametru Descriere
s / p Textul sau octeții verificați.
r La ValidRune: valoarea verificată.

Ce returnează

true sau false.

Exemple

Exemplul 1: Texte valide și invalide

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	fmt.Println(utf8.ValidString("Brașov"))
	fmt.Println(utf8.ValidString("Bra\xbaov"))
	fmt.Println(utf8.ValidString("Iași"[:3]))
	fmt.Println(utf8.Valid([]byte{0xc8, 0x99}))
}

Rezultat

true
false
false
true

Exemplul 2: Valori rune valide

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	for _, r := range []rune{'ș', 0x10FFFF, 0x110000, 0xD800, -1} {
		fmt.Printf("%#x valid: %t\n", r, utf8.ValidRune(r))
	}
}

Rezultat

0x219 valid: true
0x10ffff valid: true
0x110000 valid: false
0xd800 valid: false
-0x1 valid: false

Greșeli frecvente

  • Presupui că orice string din Go este UTF-8 valid. Doar textele scrise în codul sursă sunt; cele construite din octeți arbitrari pot fi invalide.

Comenzi înrudite

  • strings.ToValidUTF8: Înlocuiește octeții care nu formează UTF-8 valid cu un text la alegere (de exemplu „?” sau „�”).
  • 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.FullRune: FullRune verifică dacă octeții încep cu un caracter UTF-8 complet; RuneStart dacă un octet poate fi începutul unui caracter.