// 通用工具 // 秒寻科技 // zt 2024-01-04 package util import ( "bytes" "fmt" "io" "math/rand" "strings" "github.com/google/uuid" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transform" ) // 默认字符串表 const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%&*?" // 项目编号字符串 const projectIdCharset = "0123456789ABCDEF" // 生成 uuid func GenerateUuid() string { uuid := uuid.New().String() return uuid } // 生成随机字符串 func GenRandomString(strLen int) string { sb := strings.Builder{} sb.Grow(strLen) for i := 0; i < strLen; i++ { sb.WriteByte(charset[rand.Intn(len(charset))]) } return sb.String() } // 生成随机项目编号 // strLen:字符长度 // 返回值:项目编号ID func GenRandomProjectID(strLen int) string { sb := strings.Builder{} sb.Grow(strLen) for i := 0; i < strLen; i++ { sb.WriteByte(projectIdCharset[rand.Intn(len(projectIdCharset))]) } return sb.String() } // 去掉字符串中的空字符 func RemoveNullChars(s string) string { // 创建一个切片来存储结果字符串的字节 var result []byte // 遍历输入字符串的每个字节 for i := 0; i < len(s); i++ { // 检查当前字节是否是 \u0000(即空字符) if s[i] != 0 { // 如果不是空字符,则将其添加到结果切片中 result = append(result, s[i]) } } // 将结果切片转换回字符串并返回 return string(result) } // 字符转换,将GBK格式(2字节标识一个汉字)的字符转成utf8字符(4字节表示一个汉字) func CharTransGbToUtf8(gb2312Bytes []byte) ([]byte, error) { //创建一个 GB2312到 UTF-8 的转换器 reader := transform.NewReader(bytes.NewReader(gb2312Bytes), simplifiedchinese.GB18030.NewDecoder()) //读取转换后的 UTF-8 编码的字节切片 utf8Bytes, err := io.ReadAll(reader) if err != nil { fmt.Println("Error converting encoding:", err) return nil, err } // 将 UTF-8 编码的字节切片转换为字符串并打印 return utf8Bytes, nil } // 字符转换,将utf8格式(4字节表示一个汉字)转成GBK格式(2字节标识一个汉字) func CharTransUtf8ToGb(utf8Bytes []byte) ([]byte, error) { var buf bytes.Buffer // 创建一个GB18030编码器 encoder := simplifiedchinese.GB18030.NewEncoder() //将utf8转成gb _, err := transform.NewWriter(&buf, encoder).Write(utf8Bytes) if err != nil { return nil, err } //返回gb编码 return buf.Bytes(), nil }