Sobes.tech
Junior

Jak přečíst řádek obsahující hieroglyfy, cyrilici a jiné znaky?

sobes.tech AI

Odpověď od AI

V Golang jsou řetězce ve výchozím nastavení reprezentovány v UTF-8, což umožňuje bez problémů pracovat s znaky z různých abeced, včetně hieroglyfů a cyrilice. Pro čtení takových řetězců stačí používat standardní funkce a balíčky.

Čtení ze souboru:

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

func readStringFromFile(filename string) error {
	file, err := os.Open(filename)
	if err != nil {
		return fmt.Errorf("chyba při otevírání souboru: %w", err)
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text() // Řádek je již v UTF-8
		fmt.Println(line)
	}

	if err := scanner.Err(); err != nil {
		return fmt.Errorf("chyba při skenování souboru: %w", err)
	}
	return nil
}

Čtení ze standardního vstupu:

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

func readStringFromStdin() {
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("Zadejte řetězec: ")
	line, _ := reader.ReadString('\n') // Řetězec je načten ve slice byteů a poté převeden na string (UTF-8)
	fmt.Println("Zadali jste:", line)
}

Iterace přes znaky (rune):

import "fmt"

func iterateString(s string) {
	for i, r := range s { // Range iteruje přes runy (Unicode code pointy)
		fmt.Printf("Pozice: %d, Runa: %c, Kódový bod: %U\n", i, r, r)
	}
}

Hlavní body:

  • V Golang jsou řetězce neměnné sekvence bytů.
  • Výchozí kódování je UTF-8. To zajišťuje správné zobrazení znaků z různých jazyků.
  • Iterace přes řetězec pomocí range zpracovává každý rune (Unicode code point), nikoliv každý byte.

Dále:

Pokud zdrojová data nejsou v UTF-8, může být nutné provést konverzi kódování pomocí balíčků z standardní knihovny nebo externích knihoven, například golang.org/x/text/encoding.