分解探索string编码

转为byte数组

func main() {s := "Hi小智加油!"fmt.Println("len(s):",len(s)) //len(s): 15 为什么是15呢?for _, v := range []byte(s) {fmt.Printf("%X ",v) //%X 转为16进制//48 69 E5 B0 8F E6 99 BA E5 8A A0 E6 B2 B9 21//猜测从第三个开始(E5 B0 8F) -> 小 ,后面都是三个字节代表一个汉字//其实utf-8 是使用的可变长度来编码的(世界上这么多语言,如果全部都是3个直接来编码,太浪费空间)}
}

通过打印我们猜测,这个byte数组中,中文汉字是使用3个字节来编码

直接遍历string

验证:上述猜想

func main() {for k, v := range s {   //v is a runefmt.Printf("(%d,%X)",k,v)//(0,48)(1,69)(2,5C0F)(5,667A)(8,52A0)(11,6CB9)(14,21)}
}

如图for k, v := range sv是一个int32类型:

发现从第三个开始汉字,下标正确2,但是下一个就变成了5,这说明,上面转为byte数组时我们的猜想是正确的, 一个汉字使用了3个byte来表示,但是这样遍历 根本不是我们想要的,因为下标的问题.

总结:既 直接遍历字符串时,k 为 byte数组的下标 而 v 却是int32类型(rune)

utf8工具类解码

//使用 utf8工具类fmt.Println("s rune counts:",utf8.RuneCountInString(s))//s rune counts: 7 ,发现是s的长度是我们想要的了

既然可以得到正确的长度了,尝试一个字一个字解码

bytes := []byte(s)for len(bytes)>0 {ch, size := utf8.DecodeRune(bytes) //解码byte数组 返回rune和size长度bytes = bytes[size:] //截取bytefmt.Printf("%c " ,ch)}
H i 小 智 加 油 !  //发现每个字符都被解码出来了

结论

在go中,rune就相当于Java中的char,而rune是uft8编码

正常遍历一个string的方法

fmt.Println();for k, v := range []rune(s) { //直接将string转为rune切片fmt.Printf("(%d %c)",k,v) //%c 可以将rune转为 字符串}
(0 H)(1 i)(2 小)(3 智)(4 加)(5 油)(6 !) 得到了我们想要的答案.

TEST:查找到一个字符串中最长不重复字符串(国际版)

这里直接跳过了这个test的解题思路,如果没有看过的同学, 点击上篇查看

func findMaxNoRepeatString(s string) int {start := 0keysIndex := make(map[rune]int)lenth := 0for i, v := range []rune(s) { //将byte换成rune即可lastIndex, ok := keysIndex[v]if ok && lastIndex >= start {start = lastIndex + 1} else {lenth = i - start + 1}keysIndex[v] = i}return lenth
}


作者所有的学习源码在 go学习源码github地址,如果觉得有用的话帮小智贡献一个star

c++代码转为go_Go语言学习笔记六--string编码相关推荐

  1. r语言代码html,R语言学习笔记-内附实例及代码

    R语言入门 R是开源的统计绘图软件,也是一种脚本语言,有大量的程序包可以利用. R中的向量.列表.数组.函数等都是对象,可以方便的查询和引用,并进行条件筛选. R具有精确控制的绘图功能,生成的图可以另 ...

  2. c语言float二进制输出代码_C语言学习笔记——学前知识概述

    将我大一学习C语言时做的笔记拿来与大家分享,内容比较浅显,比较适合初学者,如有错误还请见谅,提出改正,谢谢! 前言:此C语言笔记是本人在自学时记录的一些重点或初学者常犯的错误,希望我的这本笔记能够对大 ...

  3. 梓益C语言学习笔记之指针

    梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...

  4. C语言学习笔记-P1 初识C语言(2)

    C语言学习笔记-P1 初识C语言(2) C语言学习笔记-P1 初识C语言(2) 一.常量 1.字面常量 2.const修饰的常变量 3.#define定义的标识符常量 3.枚举常量 二.字符串+转义字 ...

  5. R语言学习笔记(1~3)

    R语言学习笔记(1~3) 一.R语言介绍 x <- rnorm(5) 创建了一个名为x的向量对象,它包含5个来自标准正态分布的随机偏差. 1.1 注释 由符号#开头. #函数c()以向量的形式输 ...

  6. C语言学习笔记第十天

    C语言学习笔记第十天 目录 C语言学习笔记第十天 一.什么是堆内存 二.为什么要使用堆内存 三.如何使用堆内存 四.malloc的内存管理机制 五.使用堆内存需要注意的问题 六.内存清理函数 七.堆内 ...

  7. 【Go语言 · 学习笔记】

    文章目录 Go语言 · 学习笔记 一.Go包管理 1. 什么是Go语言中的包 2. 包的命名 3. main包 4. 导入包 5. 远程包导入 6. 命名导入 7. 包的init函数 二.Go开发工具 ...

  8. c语言计算时钟的夹角不用if,C语言学习笔记——计算时钟的夹角

    C语言学习笔记--计算时钟的夹角 题目内容: 钟面上的时针和分针之间的夹角总是在 0 -180之间 ( 包括 0 和180 ) .举例来说,在十二点的时候两针之间的夹角为 0 ,而在六点的时候夹角为1 ...

  9. R语言学习笔记——入门篇:第一章-R语言介绍

    R语言 R语言学习笔记--入门篇:第一章-R语言介绍 文章目录 R语言 一.R语言简介 1.1.R语言的应用方向 1.2.R语言的特点 二.R软件的安装 2.1.Windows/Mac 2.2.Lin ...

最新文章

  1. Visual 2015创建新项,缺少ADO.NET 实体数据模型的解决方法
  2. Mysql Workbench导出数据库时报 Unknown table ‘column_statistics‘ in information_schema (1109)
  3. 获取WinCE已加载驱动的信息
  4. python列表功能默写_初识 Python 作业及默写
  5. pandas 合并所有列_Python学习:Pandas库
  6. 认识web网页 了解网页的组成
  7. ios fixed定位后内容不显示_记录CSS中 position:fixed 踩的坑
  8. 抽象类与接口的区别与联系
  9. Enterprise Library Step By Step系列(十六):使用AppSetting Application Block
  10. Hudson poll scm 时间格式说明
  11. DuckDuckGo + Alfred
  12. laravel路由设置
  13. 零刻数据提供多地优质BGP双线接入服务
  14. info.plist 隐私权限 国际化
  15. 暑假2019培训:Day3Day4提高组测试赛
  16. 如何将PDF转成PPT?为什么转换后不能编辑
  17. 如何新建一个ccs工程文件
  18. 离线调用linux命令,GitHub - rinetd/linux-command: Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。...
  19. xlsx导出以excel文件导出数据
  20. Tmw去掉名字服务器显示,7.1WOW大秘境福利:老司机分享溢出与死疽TMW监视

热门文章

  1. 安装python扩展库时只能使用pip_安装 Python 扩展库时只能使用 pip 工具在线安装,如果安装不成功就没有别的办法了。_学小易找答案...
  2. 数据结构课程设计 迷宫问题
  3. 虚拟机中安装linux
  4. elementui的upload组件怎么获取上传的文本流、_抖音feed流直播间引流你还不会玩?实操讲解...
  5. php 获取系统环境变量,java读取操作系统环境变量
  6. string 长度_String源码解析
  7. phpmyadmin 导出mysql,在phpmyadmin中导入/导出非常大的mysql数据库
  8. U-Net++粗略解释
  9. 备忘(持续更新。。。)
  10. 【hibernate merge】session1.merge(T entity)方法的含义和update方法的区别