kevinyan815 / gocookbook

go cook book

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

操作包含中文的字符串

kevinyan815 opened this issue · comments

在 Golang 中,如果字符串中出现中文字符不能直接调用 len 函数来统计字符串字符长度,这是因为在 Go 中,字符串是以 UTF-8 为格式进行存储的,在字符串上调用 len 函数,取得的是字符串包含的 byte 的个数。

正确的做法是将字符串装换为[]rune,统计[]rune切片的长度。同样截取包含字符串也是一样,先将其转为[]rune,再截取后,转为string。

// 截取姓名的前四位
package main

import (
	"fmt"
)

// 截取姓名的前四位
func NormalizeRealName(name string) (realName string) {
	realNameRune := []rune(name)
	if len(realNameRune) <= 4 {
		realName = name
		return
	}

	realName = string(realNameRune[0:4])
	return
}

func main() {
	name := "欧阳正熊戊辰"
	
	fmt.Println(NormalizeRealName(name))
}

针对统计字符串长度我们可以使用内置库unicode/utf8utf8.RuneCountInString(s)方法,更方便。

rune 代表的 unicode 码点是固定的 4 个字节长度(等同于 int32),但是很多时候常用字符的Unicode码点只用2-3个字节,这就造成了很多空间浪费所以才用的 UTF-8这种变长字符编码。

Playground URL