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í
rangezpracová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.