为什么这里的值有区别是为什么 求解

package main

import (
    "fmt"
)

func printBytes(s string) {
    for i:= 0; i < len(s); i++ {
        fmt.Printf("%x ", s[i])
    }
}


func printChars(s string) {
    runes := []rune(s)
    for i:= 0; i < len(runes); i++ {
        fmt.Printf("%c ",runes[i])
    }
}

func main() {
    runeSlice := []rune{0x0053, 0x0065, 0x00f1, 0x006f, 0x0072}
    str := string(runeSlice)
    fmt.Println(str)
    name := "Señor"
    printBytes(name)
    fmt.Printf("\n")
    printChars(name)
}

输出
Señor
53 65 c3 b1 6f 72 //5个字符被分成6个
S e ñ o r

阅读 1.8k
1 个回答

UTF8编码导致的问题,UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码Unicode字符

Unicode范围 bit数 字节数
0000 ~ 007F 0-7 1
0080 ~ 07FF 8-11 2
0800 ~ FFFF 12-16 3
  1. 你的第三个字符0x00f1已经是8-11比特的范围了。
  2. golang的len是计算字节数,所以你len中文会返回3*中文数的长度

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题