Đếm chiều dài của chuỗi/xâu tiếng Việt Golang bằng utf8.RuneCountInString(string) thay vì len(string)

Trong Go, hàm len(s) trả về số byte trong chuỗi s. Tuy nhiên, các ký tự tiếng Việt như á, ê, đ, ư không chỉ là một byte. Chúng có thể chiếm 2–3 byte trong mã hóa UTF-8. Do đó ta nên dùng 1 hàm đặc biệt có tên RuneCountInString

Tên công nhận dài loằng ngoằng. Dưới đây là một ví dụ bổ sung về hàm cắt tring.

package main

import (
	"fmt"
	"unicode/utf8"
)

func CutString(s string, limit int) string {
	runes := []rune(s)
	if len(runes) > limit {
		return string(runes[:limit])
	}
	return s
}

func main() {

	fmt.Println(CutString("Lập Trình ORG Tiếng Việt rất đẹp", 9)) // Cắt an toàn
	s2 := "Tiếng Việt"
	fmt.Println(len(s2))                                 // Kết quả: 14
	fmt.Println("Số ký tự:", utf8.RuneCountInString(s2)) // Kết quả: 10

	s := "Xin chào, tiếng Việt!" // Vietnamese string
	runeCount := utf8.RuneCountInString(s)
	sliceCount := len([]rune(s))
	byteCount := len(s)

	fmt.Printf("String: %s\n", s)
	fmt.Printf("Rune count (RuneCountInString): %d\n", runeCount) // 21
	fmt.Printf("Rune count (slice): %d\n", sliceCount)            // 21
	fmt.Printf("Byte count: %d\n", byteCount)                     // 26
}

Leave a Comment