1、字符编码

(1)ASCII码

一个字节表示的英文、数字、标点符号等字符。

国际标准ASCII码为0-127即128个字符,二进制最高位为0,其余为扩展ASCII码。

(2)GB2312

两字节,主要包含简体的常用中文及符号的字符集编码。

(3)GBK

单双字节变长编码,主要包含简体与繁体中文和一些符号、偏旁部首的字符集编码。

(4)GB18030

GBK编码无法满足需求扩展,多出来的部分使用四字节编码,即单、双、四字节编码;

扩展了汉字,还包括了少数民族文字;

(5)Unicode

因各国语言、字符差异,Unicode将所有字符统一为一套字符集。

UTF-8、UTF-16、UTF-32是对Unicode字符集的不同编码方案。

(6)UTF-8

变长编码方式,1-4字节表示一个字符,可节省存储空间;

英文1字节,中文一般3字节,最多4字节;

编码规则:

》单字节:同标准ASCII码,最高位为0,0-127表示128个字符

》多字节:n字节,高位到低位,第一字节前n位为1,第n+1位为0;后面字节前两位为10;剩余位由低位向高位填补Unicode吗,多出补0;

XXXXX XXXXXX

XXXX XXXXXX XXXXXX

2、字符串遍历

golang使用utf-8的编码方式

2.1、for循环遍历字符串

func main() {
str := "test笃志弘毅"
for i := 0; i < len(str); i++ {
fmt.Printf("%v %c,", str[i], str[i])
}
}
//116 t,101 e,115 s,116 t,231 ç,172 ¬,131 ƒ,229 å,191 ¿,151 —,229 å,188 ¼,152 ˜,230 æ,175 ¯,133 …,

  以下标访问字符串时,按单字节(byte)访问,超出单字节的编码会出现乱码。

2.2、for range遍历字符串

func main() {
str := "test笃志弘毅"
for i, v := range str {
fmt.Printf("%d-%c-%v ", i, v, v)
}
}
//0-t-116 1-e-101 2-s-115 3-t-116 4-笃-31491 7-志-24535 10-弘-24344 13-毅-27589

  for range遍历字符串时,按字符(rune)访问,中文正常显示

3、字符串转字符切片和字节切片的差异

func main() {
str := "test笃志弘毅"
runeS := []rune(str)
for i := 0; i < len(runeS); i++ {
fmt.Printf("%c-%v ", runeS[i], runeS[i])
}
fmt.Println()
byteS := []byte(str)
for i := 0; i < len(byteS); i++ {
fmt.Printf("%c-%v ", byteS[i], byteS[i])
}
}
//t-116 e-101 s-115 t-116 笃-31491 志-24535 弘-24344 毅-27589
//t-116 e-101 s-115 t-116 ç-231 ¬-172 ƒ-131 å-229 ¿-191 —-151 å-229 ¼-188 ˜-152 æ-230 ¯-175 …-133

4、字符串注意点

(1)字符串的零值为空串"",不是nil

func main() {
var str string
fmt.Println(str == "") //true
//fmt.Println(str == nil)
//invalid operation: str == nil (mismatched types string and nil)
//无效操作(string和nil类型不匹配)
}

(2)索引访问或是切片得到的都是按字节处理,可能出现乱码

(3)len函数返回的是字节数,而不是字符数  

func main() {
str := "test笃志弘毅"
fmt.Println(len(str))//16
}

(4)不能通过索引或指针修改字符串字符

func main() {
str := "test笃志弘毅"
str[2] = 'a' //cannot assign to str[2]
*(&str[2]) = 'b' // cannot take the address of str[2]
fmt.Println(str)
}

(5)字符串的切片操作返回的是字符串,而不是切片

func main() {
str := "test笃志弘毅"
str1 := str[:]
str2 := str[:]
fmt.Printf("%T %p %p\n", str1, &str1, &str2)
}
//string 0xc0000581c0 0xc0000581d0

golang——字符串与编码的更多相关文章

  1. GO语言的进阶之路-Golang字符串处理以及文件操作

    GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...

  2. Golang的字符编码介绍

    Golang的字符编码介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Go里面内建仅支持UTF8字符串编码,因此如果你用fmt.Printf之类的函数无法将GBK,GB2312 ...

  3. Golang 字符串转URLCode

    Golang 字符串转URLCode 最近因调用gitlab API,在生成某些字符串的时候直接请求 gitlab API 失败, url如下: keysURL := "http://192 ...

  4. [转] golang 字符串比较是否相等

    1 前言 strings.EqualFold不区分大小写,"==" 区分且直观. 2 代码 golang字符串比较的三种常见方法 fmt.Println("go" ...

  5. Python字符串的编码与解码(encode与decode)

    首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unico ...

  6. python基础——字符串和编码

    python基础——字符串和编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用 ...

  7. 中文字符串的编码转换(c实现)

    中文字符串在c/c++中表示为字节序列,在分词的时候需要根据不同的编码方式进行分词,一般分词器需要转换成统一的编码方式再进行转换,有些分词器如ICTCLAS在分词的时候可以不显示定义编码方式,可以检测 ...

  8. java转换字符串的编码(转)

    package com.Alex.base; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public class C ...

  9. python入门(9)字符串和编码

    python入门(9)字符串和编码 字符串是一种数据类型,比较特殊的是字符串有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理. 最早的计算机在设计时采用8个比 ...

随机推荐

  1. Python中表示中文的pattern

    Python中表示中文的pattern:[\u4e00-\u9fff] 汉字unicode码表: http://jlqzs.blog.163.com/blog/static/2125298320070 ...

  2. ElasticSearch全文搜索引擎(A)

    文章:[Elasticsearch] 全文搜索 (一) - 基础概念和match查询 全文检索,是从最初的字符串匹配和简单的布尔逻辑检索技术,演进到能对超大文本.语音.图像.活动影像等非结构化数据进行 ...

  3. 光纤通信(codevs 1955)

    题目描述 Description 农民John 想要用光纤连通他的N (1 <= N <= 1,000)个牲口棚(编号1..N).但是,牲口棚位于一个大池塘边,他仅可以连通相邻的牲口棚.J ...

  4. android studio配置so文件路径

    将一个项目从eclipse上移植到android studio时,发现总是加载不成功库文件,so库文件放在了main/src/libs下的目录. 参考网上资料,studio默认的库文件路径是main/ ...

  5. CentOS7使用mount命令来挂载CDROM

    https://blog.csdn.net/testcs_dn/article/details/41448557

  6. AOJ -0033 Ball(DFS)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=22516 一道需要思考的搜索题. 题意:十个球按给定顺序从图中所示容器中下落, ...

  7. POJ 3684_Physics Experiment

    题意: 若干球最初从高到低排列,依次落下. 球与地面碰撞,速度不变方向相反,球之间碰撞, 交换速度和方向.问某一时刻各个球的高度. 分析: 把球之间的碰撞看成是擦肩而过,但是由于半径的存在,最后每个球 ...

  8. 本地配置nginx的https

    前文:因为要用谷歌下的getUserMedia方法,而getUserMedia方法只能在https下才能调用,所以在本地搭建https来测试,现在说说步骤. 步骤1:下载nginx-1.10.3.zi ...

  9. 详解ORACLE数据库的分区表

    此文从以下几个方面来整理关于分区表的概念及操作:    1.表空间及分区表的概念    2.表分区的具体作用    3.表分区的优缺点    4.表分区的几种类型及操作方法    5.对表分区的维护性 ...

  10. HDU 4950 Monster(公式)

    HDU 4950 Monster 题目链接 题意:给定怪兽血量h,你攻击力a.怪物回血力b,你攻击k次要歇息一次,问是否能杀死怪兽 思路:签到题,注意最后一下假设打死了怪,那么怪就不会回血了 思路: ...