String 鼓浪中的字符串和字符

String 鼓浪中的字符串和字符,string,go,unicode,String,Go,Unicode,我需要一些帮助来理解如何在go中管理字符串 考虑下面的go代码 package main import ( "fmt" "unicode/utf8" ) func main() { var1, var2 := 'a', 'ă' fmt.Printf("For var1 - Char: %c, Type: %T, Value: %d\n", var1, var1, var1) fmt.Pri

我需要一些帮助来理解如何在go中管理字符串

考虑下面的go代码

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {

    var1, var2 := 'a', 'ă'

    fmt.Printf("For var1 - Char: %c, Type: %T, Value: %d\n", var1, var1, var1)
    fmt.Printf("For var2 - Char: %c, Type: %T, Value: %d\nSo far so good, rune is an alias for int32 and the value is the Unicode Decimal Value\n\n", var2, var2, var2)

    str := "aă"

    fmt.Printf("%v is %v bytes \nI understand this, the a takes up one byte the ă takes up two bytes\n\n", str, len(str))

    for i := 0; i < len(str); {
        r, size := utf8.DecodeRuneInString(str[i:])
        fmt.Printf("For character #%v in \"str\" (%q) Char: %c, Type: %T, Value: %d\n", i+1, str, r, r, r)
        i += size
    }
    fmt.Printf("Same as above, done differently - the loop loops through the characters in the \nstring \"str\" by determining how much to jump in the underlying slice for the string\n")
    fmt.Printf("the first iteration only goes over one position and then the next iteration \ngoes over two\n")

    fmt.Println("\nNow lets go Byte by Byte ...")
    fmt.Println("Byte (not rune) at position 0: ", str[0])
    fmt.Println("Byte (not rune) at position 1: ", str[1])
    fmt.Println("Byte (not rune) at position 2: ", str[2])
    fmt.Println("Ok, I am a little confused. Position 0 holds the unicode decimal value of \"a\"")
    fmt.Printf("but what is %v and %v to  \"ă\" ?\n", str[1], str[2])

}


主程序包
进口(
“fmt”
“unicode/utf8”
)
func main(){
var1,var2:=“a”,“ă”
fmt.Printf(“对于var1-字符:%c,类型:%T,值:%d\n”,var1,var1,var1)
fmt.Printf(“对于var2-Char:%c,类型:%T,值:%d\n到目前为止还不错,符文是int32的别名,值是Unicode十进制值\n\n”,var2,var2,var2)
str:=“aă”
fmt.Printf(“%v是%v字节\n我理解这一点,a占用一个字节,ă占用两个字节\n\n”,str,len(str))
对于i:=0;i
这表明了以下几点

对于var1-Char:a,类型:int32,值:97

对于var2-Char:ă,类型:int32,值:259

到目前为止,rune是int32的别名,其值是 Unicode十进制值aă是3个字节我理解这一点,a占了 在“str”(“aă”)中,1个字节的ă占字符#1的两个字节 字符:a,类型:int32,值:97

对于“str”(“aă”)中的字符2,Char:ă,类型:int32,值:259

与上面相同,但操作方式不同-循环通过 字符串“str”中的字符,通过确定在 字符串的底层切片第一次迭代只遍历一个 定位,然后下一次迭代进行两次,现在释放字节 按字节

位置0处的字节(非符文):97

位置1:196处的字节(非符文)

位置2处的字节(非符文):131

好吧,我有点困惑。位置0保存unicode十进制值 但什么是196和131对“ă”


在此处检查UTF-8编码:

196:11000100

131:10 000011


所以:00100 000011->259

字符串是utf8编码的,这就是为什么您使用了
“unicode/utf8”
包。你希望
str[1]
str[2]
是什么?谢谢-我只需要朝正确的方向轻轻推一下。