go 语言字符类型 byte 与 rune案例详解
作者:岳来 发布时间:2024-04-26 17:22:57
golang
的字符有如下两种:
一种是
uint8['ju:nɪt]
类型叫做 byte 型,代表了 ASCII 码的一个字符。另一种是
rune[ruːn]
类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。
一、byte
类型介绍
byte 类型是 uint8 的别名,可以表达只占用 1 个字节的传统 ASCII 编码的字符,例如 var c byte = 'A'
用单引号括起来的单个字符是字符类型,用双引号括起来的字符是字符串类型
package main
import "fmt"
func main(){
var c byte = 'A'
fmt.Println(c)
fmt.Printf("%T ",c)
fmt.Printf("\n")
var d rune = 'A'
fmt.Println(d)
fmt.Printf("%T ",d)
// var e byte = 'AB' // more than one character in rune literal
// var e rune = 'AB' // more than one character in rune literal
var e string = "AB"
fmt.Println(e)
fmt.Printf("%T ",e)
fmt.Printf("\n")
var f byte = 'C'
println(f)
f = 88
println(f)
}
// 结果如下
65
uint8
65
int32
AB
string
67
88
二、rune
类型介绍
在书写 Unicode 字符时,需要在 16 进制数之前加上前缀
\u
或者\U
。Unicode 至少占用 2 个字节,所以我们使用 int16 或者 int 类型来表示。
需要使用到 4 字节,则使用
\u
前缀,如果需要使用到 8 个字节,则使用\U
前缀。
var h int = '\u0041'
fmt.Println(h) // 65
var i int = '\U00000041'
fmt.Println(i) // 65
三、遍历含有中文(Unicode)时差异
3.1、遍历打印一个字符串,当使用byte类型时:
package main
import "fmt"
func main(){
str:="hello 世界"
for i:=0;i<len(str);i++{
fmt.Printf("%c",str[i]) // hello ä¸ç
fmt.Printf("\n")
}
}
// 结果如下:
h
e
l
l
o
ä
¸
ç
上面结果,英文字符正确打印,但中文乱码。是因为UTF8编码下一个中文汉字由3~4个字节组成,而字符串是由byte字节组成,所以长度也是byte字符长度,这样遍历时遇到中文就乱码了。
3.2、使用rune 类型来遍历字符串
在 Go 中,有一个遍历方式是 range
,它默认就是以 UTF-8 编码形式去读每一个字符。当涉及到的字符串中含有非英文字符时,可以使用 range 来遍历:
104
101
108
108
111
32
19990
30028
此时输出的字节编码就是 UTF-8 编码号,UTF-8 编码是包含 ASCII 编码的,所以前 6 个编号还是一样的,后面两个编号分别代表世,界。
四、go 语言字符串修改
所谓对字符串的修改其实不是对字符串本身的修改,而是复制字符串,同时修改值,即重新分配来内存。
在go中修改字符串,需要先将字符串转化成数组,[]byte
或 []rune
,然后再转换成 string型。
4.1、对于全是ASCII编码的字符串:
package main
import "fmt"
func main(){
str:="hello"
fmt.Println(str)
s1:=[]byte(str)
s1[0]='H'
fmt.Println(string(s1))
}
// 结果如下
hello
Hello
4.2、对于包含非ASCII编码的字符串:
package main
import "fmt"
func main(){
str01:="hello 世界"
fmt.Println(str01)
s2:=[]rune(str01)
s2[0]='H'
fmt.Println(string(s2))
}
// 结果如下
hello 世界
Hello 世界
参考文档
1、https://blog.csdn.net/AXIMI/article/details/120379225
2、https://lesscode.work/sections/62b076e9d22ba.html
3、https://www.liaoxuefeng.com/wiki/1016959663602400/1016959856222624
4、https://www.cnblogs.com/wjaaron/p/14822799.html
5、https://www.bbsmax.com/A/D854aVKpdE/
来源:https://blog.csdn.net/yuelai_217/article/details/129256360


猜你喜欢
- 通过学习私有函数与私有变量,可以更好的完善 类的开发 ,从而丰满我们的场景与实现方案。什么是私有函数和私有变量私有函数与私有变量中的私有是什
- function gaga(obj){ // 值允许输入一个小数点和数字 obj.value = obj.value.replace(/[^
- RIFF file formatRIFF全称为资源互换文件格式(Resources Interchange File Format),是Wi
- 假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。用来保存整机产品信息的表叫做pc;用来保存配件供货信息的表叫做parts。在pc
- 本文实例讲述了python中元类用法,分享给大家供大家参考。具体方法分析如下:1.元类(metaclass)是用来创建类的类2.type(o
- 编程中有时候需要一个初始极大值(或极小值)作为temp,当然可以自定义设置为10000(whatever),不过python中有一个值可以代
- 1.1. 前言众所周知,安服工程师又叫做Word工程师,在打工或者批量SRC的时候,如果产出很多,又需要一个一个的写报告的情况下会非常的折磨
- 导言在前面我们学习了如何创建item级的DataList。和可编辑的GridView一样,每个DataList里的item都包含一个Edit
- 此程序为先调用opencv自带的人脸检测模型,检测到人脸后,再调用我自己训练好的模型去识别人脸,使用时更改模型地址即可#!usr/bin/e
- asp之家注:本篇asp留言本教程可以说是我见过的最详细,写的最认真的,最适合初学者来学习asp的一篇教程。在此感谢作者hemooday。可
- 一、适合创建索引1、字段的数值有唯一性限制根据Alibaba规范,指明在业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。例如,
- get和post方法最大的不同在于:1.get方法传值参数在url里面,而post参数放send里面2.post方法必须加上xmlHttp.
- 一、删除字符串两端的一种或多种字符#strip()、lstrip()、rstrip()方法;(默认删除空格符)A、list.strip(字符
- 有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。本章节我们将为大家介绍如
- 本文实例讲述了Python疯狂填词程序实现方法。分享给大家供大家参考,具体如下:题目如下:创建一个疯狂填词程序,它将读入文件,并让用户在该文
- 引言如果熟悉使用JDBC来连接数据库的同学一定很清楚连接数据库的代码中一定会有依据Class.forName("com.mysql
- 本文实例为大家分享了Python将一个Excel拆分为多个Excel的具体代码,供大家参考,具体内容如下原始文档如下图所示将销售部门一、二、
- 1、MySQL 5.6.32 64位安装包下载在官网http://dev.mysql.com/downloads/mysql/5.6.htm
- 这里其实并不需要其它的什么函数来支持,只需要使用MYSQL提供的一些SQL语句就可以了。这里为了简单起见,以MYSQL的系统表USER为例,
- 自动化测试执行的用例有很多,python额测试用例文件,都是以“test”开头的。TestLoader(defaultTestLoader)