6

How to reverse a string by byte or rune

 3 years ago
source link: https://yourbasic.org/golang/reverse-utf8-string/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

How to reverse a string by byte or rune

yourbasic.org/golang
ambiguity-ambigram.png

Byte by byte

It’s pretty straightforward to reverse a string one byte at a time.

// Reverse returns a string with the bytes of s in reverse order.
func Reverse(s string) string {
    var b strings.Builder
    b.Grow(len(s))
    for i := len(s) - 1; i >= 0; i-- {
        b.WriteByte(s[i])
    }
    return b.String()
}

Rune by rune

To reverse a string by UTF-8 encoded characters is a bit trickier.

// ReverseRune returns a string with the runes of s in reverse order.
// Invalid UTF-8 sequences, if any, will be reversed byte by byte.
func ReverseRune(s string) string {
    res := make([]byte, len(s))
    prevPos, resPos := 0, len(s)
    for pos := range s {
        resPos -= pos - prevPos
        copy(res[resPos:], s[prevPos:pos])
        prevPos = pos
    }
    copy(res[0:], s[prevPos:])
    return string(res)
}

Example usage

for _, s := range []string{
	"Ångström",
	"Hello, 世界",
	"\xff\xfe\xfd", // invalid UTF-8
} {
	fmt.Printf("%q\n", ReverseRune(s))
}
"mörtsgnÅ"
"界世 ,olleH"
"\xfd\xfe\xff"

Further reading

40+ practical string tips [cheat sheet]

Share:             


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK