首页 > 其他分享 >golang中 String bytes rune 和 字符概念与应用

golang中 String bytes rune 和 字符概念与应用

时间:2023-11-07 19:33:06浏览次数:41  
标签:编码 utf String fmt bytes golang Unicode main 字节

一、引入问题-为何打印s[0] 没有打印‘你’字符

package main

import "fmt"

func main() {
	s := "你"
	fmt.Println(s[0])
	fmt.Printf("%s\n", s[0])
}
  • output
%!s(uint8=228)

首先需要知道go中编码格式和String 类型, Go内置的utf-8编码格式。

二、utf-8编码 与 Unicode

  • Unicode,全称为Unicode标准(The Unicode Standard),其官方机构Unicode联盟所用的中文名称为统一码,为各种语言中的每个字符定义一个唯一的编码,也描述为码点。
  • utf-8编码 是一种可变长编码方式,可以用一至四个字节对有效码点进行编码。

‘a' 对应的Unicode值为U+0061 -- utf-8编码后自己 “\x61”(前128个字符与ASCII编码兼容)
‘你’ 对应的Unicode值为U+4F60 -- utf-8编码后字节 “\xe4\xbd\xa0”

三、String类型

  • 在GO中String类型可以存储任意字节,在编写代码过程,当定义好一个字符串时,存储的是utf-8编码后的字节, 也就是说以下的s和s1字符串是等价的
package main

import "fmt"

func main() {
	s := "你"
	s1 := "\xe4\xbd\xa0"
	if s == s1 {
		fmt.Println("s == s1")
	}
}

output

s == s1

可以看到 s字符串实际存储的是对‘你’字符utf-8编码后的字节,那么回到最开始的问题,当使用下标进行访问的时候,s[0]打印的应该是编码后的第一个字节

fmt.Printf("%x", s[0])

output

e4 //确实如猜测一样打印第一个字节

那么是如何解决这个问题,按字符来进行访问,而不是字节?

四、rune类型

4.1定义

在builtin/builtin.go文件中定义描述

// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32

主要作用是用来区分字符值和整数值

4.2 应用

4.2.1 将字符串转化为rune类型

package main

import "fmt"

func main() {
	s := "你好"
	s1 := []rune(s)
	fmt.Printf("字节个数: %d\n", len(s))
	fmt.Printf("字符个数: %d\n", len(s1))
}

output

字节个数: 6
字符个数: 2

4.2.2 range
因为在GO中utf-8是唯一的编码方式,因此在对字符串使用range遍历时,会对字符串使用utf-8进行解码,转化为rune类型输出

package main

import "fmt"

func main() {
	s := "你好"
	for _, c := range s {
		fmt.Printf("%s\n", string(c))
	}
}

output

你
好

五、参考资料

Strings, bytes, runes and characters in Go
utf-8编码介绍 wiki
Unicode介绍

标签:编码,utf,String,fmt,bytes,golang,Unicode,main,字节
From: https://www.cnblogs.com/chen-pi/p/17815753.html

相关文章

  • Golang简单使用wasm
    go代码packagemainimport( "syscall/js")funcaddxxxx(thisjs.Value,args[]js.Value)interface{}{ iflen(args)!=2{ return"Invalidnumberofarguments.Expected2." } num1:=args[0].Float() num2:=args[1].Float() res......
  • string的模拟实现
    前言string在C++里是一个已经被封装好的类,类中实现了各种功能的函数,可以让我们更轻松的对字符串进行操作。在此通过对string类的模拟实现来进一步了解string类函数的使用。一、string类简单了解1.string的大小定义一个库中的string类的对象s1,并计算其大小。如下图可以看到,string类......
  • StringTokenizer
    Java中StringTokenizer的一个实例。 代码:StringTokenizerst=newStringTokenizer("thisisatest");while(st.hasMoreTokens()){System.out.println(st.nextToken());}打印出来之后是:thisisatest 接下来的实例阐明了Stirng.split方法如何将一个......
  • Golang实现简单的后门程序
    packagemainimport( "io" "net" "os/exec")funcmain(){ var( listenernet.Listener errerror connnet.Conn ) listener,err=net.Listen("tcp",":8080") iferr!=nil{ panic(e......
  • JavaScript string对象(属性,方法)获取图片后缀案例 输入和输出结果转换形式案例
    一、创建string对象varstrOb=newString("abcefg");varstrOb=String("abcefg");varstrOb="abcefg";二、属性length  (字符串长度)varstr='hello';console.log(str.length)//5三、方法1、子字符串位置indexOf(string,[index])str......
  • Golang 基础(一)
    1.packagemanagementgopackagemanagement1.history2.gomodulesGOPATH:Unifiedpackagestoragepath-notsupportversioncontrolofdependencypackagesGOPATHmode:useGOPATHtomanageGOPATH:thepath不是使用GOPATH模式就一定是使用GOPATH路径GOROOT是go......
  • js substring截取字符串,不信你看不懂,简单案例分享
     在JavaScript中,substring 方法用于截取字符串。它返回字符串的一个子集,即原始字符串中介于两个指定下标之间的字符。substring 方法的语法如下:str.substring(indexStart[,indexEnd])indexStart:必需的参数,表示要提取的第一个字符的下标(位置)。如果 indexStart 大于 ind......
  • Golang使用grpc实现token拦截
    上一篇简单使用了grpcGolang简单使用grpcserverpackagemainimport( "fmt" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" "google.golang.......
  • Golang实现grpc单向认证
    接着上篇文章写Golang简单使用grpcgolang1.15+版本上,用gRPC通过TLS实现数据传输加密时,会报错证书的问题:rpcerror:code=Unavailabledesc=connectionerror:desc="transport:authenticationhandshakefailed:x509:certificateisnotvalidforanynames,but......
  • jupyter 下 bitandbytes报错记录
    背景:在jupyter中加载baichuan大模型时报错报错一:frompeftimportPeftModel 报错报错提示:python-mbitsandbytes执行python-mbitsandbytes时又报错,报错内容为:Traceback(mostrecentcalllast):File"/home/miniconda3/envs/vllm/lib/python3.10/runpy.py",lin......