0 Tage Serie
go / intermediate
Snippet

Korrekte Verarbeitung von UTF-8-Text mit Runen

In Go sind Strings schreibgeschützte Byte-Slices. UTF-8-Zeichen wie Emojis oder Akzente belegen mehrere Bytes. Das Slicen oder Indizieren eines Strings greift direkt auf rohe Bytes zu, was Mehrbyte-Zeichen beschädigen kann. Go verwendet den Typ rune (ein Alias für int32), um einen Unicode-Codepunkt darzustellen. Eine range-Schleife über einen String decodiert UTF-8 automatisch in Runen, und das Konvertieren eines Strings in []rune ermöglicht den korrekten zeichenbasierten Direktzugriff sowie die Längenberechnung.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
import "fmt"
func main() {
text := "Gopher 🚀"
fmt.Println("Iterating by byte:")
for i := 0; i < len(text); i++ {
fmt.Printf("%x ", text[i])
}
fmt.Println()
fmt.Println("Iterating by rune (range loop):")
for index, runeVal := range text {
fmt.Printf("%d:%q ", index, runeVal)
}
fmt.Println()
runes := []rune(text)
fmt.Printf("Sub-string length: %d, Char at index 7: %c\n", len(runes), runes[7])
}
Erklärung
1
text := "Gopher 🚀"
Definiert einen String, der Standard-ASCII-Zeichen und ein Mehrbyte-Raketen-Emoji (das 4 Bytes benötigt) enthält.
2
len(text)
Gibt die Länge des Strings in Bytes (11 Bytes) zurück, nicht die Anzahl der Zeichen (8 Zeichen).
3
for index, runeVal := range text
Die range-Schleife decodiert UTF-8-Bytes automatisch in einzelne Runen und liefert deren Start-Byte-Indizes.
4
runes := []rune(text)
Konvertiert den String in ein Slice von Runen. Dies allokiert Speicher, ermöglicht aber einen zeichenbasierten O(1)-Direktzugriff wie runes[7].