请教golang怎么把utf8编码转成字符

mking · · 3349 次点击
写在文件里面的如果是 \346\200\241 这样的字符串显示,那实际的字符串是"\\346\\200\\241", 这个字符串不是"怡",按照UTF-8来讲,前者是12个字符,后者是1个字符,他们在文件里面的二进制表示前者是12个字节,后者是3个字节,这3个字节的八进制表示就是 \346\200\241。 需要将文件里面的 \346\200\241 这样的字符串表示还原为他们实际想表达的二进制: package main import ( "bufio" "fmt" "os" "regexp" "strconv" ) func main() { reg := regexp.MustCompile(`[0-7]{3}`) s, err := os.Open("a.log") if err != nil { fmt.Println(err) return } defer s.Close() d, err := os.Create("b.log") if err != nil { fmt.Println(err) return } defer d.Close() bs := bufio.NewReader(s) bd := bufio.NewWriter(d) for { b, err := bs.ReadString('\\') if err != nil { fmt.Println(err) break } arr := reg.FindStringIndex(b) nextWriteAt := 0 if len(arr) >= 2 && 0 == arr[0] { if i, err := strconv.ParseInt(b[:arr[1]], 8, 0); nil == err { bd.Write([]byte{byte(i)}) nextWriteAt = arr[1] } } bd.Write([]byte(b[nextWriteAt : len(b)-1])) } bd.Flush() }
#6
更多评论
UTF-8的八进制表示,go天生就支持的,直接fmt.Printf("%s") package main import ( "fmt" ) func main() { s := "\346\200\241\347\276\244" fmt.Printf("%s, %x, %o\n", s, s, []byte(s)) for i, r := range s { fmt.Printf("start index:%v, rune:%#U\n", i, r) } } https://golang.org/ref/spec#Rune_literals
#1
怡群, e680a1e7bea4, [346 200 241 347 276 244] start index:0, rune:U+6021 '怡' start index:3, rune:U+7FA4 '群'
#2