bufio.Reader.ReadRune în Go

Citește un singur caracter Unicode (rune), decodând corect literele de mai mulți octeți ca ă, ș, €.

Sintaxă
func (b *Reader) ReadRune() (r rune, size int, err error)

Ce face bufio.Reader.ReadRune

ReadRune citește următorul caracter UTF-8 și îl returnează ca rune, împreună cu numărul de octeți pe care îl ocupă (1 pentru a, 2 pentru ș, 3 pentru €). La final returnează io.EOF.

Dacă octeții nu formează un caracter UTF-8 valid, returnează unicode.ReplacementChar (U+FFFD) și size = 1. UnreadRune pune înapoi ultimul caracter citit, util la analizatoare de text.

Ce returnează

Caracterul, dimensiunea lui în octeți și eroarea (io.EOF la final).

Exemple

Exemplul 1: Caractere și octeți

package main

import (
    "bufio"
    "fmt"
    "strings"
)

func main() {
    r := bufio.NewReader(strings.NewReader("aș€"))
    for {
        c, n, err := r.ReadRune()
        if err != nil {
            break
        }
        fmt.Printf("%q: %d octeți, cod %U\n", c, n, c)
    }
}

Rezultat

'a': 1 octeți, cod U+0061
'ș': 2 octeți, cod U+0219
'€': 3 octeți, cod U+20AC

Exemplul 2: Numărarea vocalelor de la tastatură

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    r := bufio.NewReader(os.Stdin)
    vocale, litere := 0, 0
    for {
        c, _, err := r.ReadRune()
        if err != nil || c == '\n' {
            break
        }
        if strings.ContainsRune("aăâeiîouAĂÂEIÎOU", c) {
            vocale++
        }
        if c != ' ' {
            litere++
        }
    }
    fmt.Printf("%d vocale din %d litere\n", vocale, litere)
}

Ce scrie utilizatorul (intrare)

Învățăm Go în Iași

Rezultat

8 vocale din 15 litere

Greșeli frecvente

  • Citești câte un octet (ReadByte) dintr-un text cu diacritice. Literele ca ș se rup în două valori fără sens.

Comenzi înrudite

  • bufio.NewReader: Învelește un io.Reader într-un bufio.Reader, care citește pe blocuri și oferă ReadString, ReadRune, ReadLine.
  • bufio.Writer.WriteString: WriteString adaugă un text în buffer; WriteRune adaugă un singur caracter Unicode, codat UTF-8.
  • bufio.Reader.ReadString: Citește până la (și inclusiv) caracterul delimitator; ReadString dă un string, ReadBytes un []byte.