golang——字符串与编码
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——字符串与编码的更多相关文章
- GO语言的进阶之路-Golang字符串处理以及文件操作
GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...
- Golang的字符编码介绍
Golang的字符编码介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Go里面内建仅支持UTF8字符串编码,因此如果你用fmt.Printf之类的函数无法将GBK,GB2312 ...
- Golang 字符串转URLCode
Golang 字符串转URLCode 最近因调用gitlab API,在生成某些字符串的时候直接请求 gitlab API 失败, url如下: keysURL := "http://192 ...
- [转] golang 字符串比较是否相等
1 前言 strings.EqualFold不区分大小写,"==" 区分且直观. 2 代码 golang字符串比较的三种常见方法 fmt.Println("go" ...
- Python字符串的编码与解码(encode与decode)
首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unico ...
- python基础——字符串和编码
python基础——字符串和编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用 ...
- 中文字符串的编码转换(c实现)
中文字符串在c/c++中表示为字节序列,在分词的时候需要根据不同的编码方式进行分词,一般分词器需要转换成统一的编码方式再进行转换,有些分词器如ICTCLAS在分词的时候可以不显示定义编码方式,可以检测 ...
- java转换字符串的编码(转)
package com.Alex.base; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public class C ...
- python入门(9)字符串和编码
python入门(9)字符串和编码 字符串是一种数据类型,比较特殊的是字符串有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理. 最早的计算机在设计时采用8个比 ...
随机推荐
- 实现下载pdf文件
//打开文件//$fileDir为文件路径 $fileName为文件名称$file = fopen($fileDir . DS . $fileName, "r");//输入文件标签 ...
- 【最大流】Escape
https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/F [题意] 给定n个人和m个星球,每个人可以匹配某些星球,每个星球有一定的容量限 ...
- Codeforces713D. Animals and Puzzle
$n<=1000,m<=1000$,$n*m$的01矩阵,给$t<=1000000$个询问,每次问一个矩形中最大的1正方形的边长. 先想想不考虑“一个矩形中”的限制,那记$f(i,j ...
- 无权二分图最大匹配 HDU2063 匈牙利算法 || Hopcroft-Karp
参考两篇比较好的博客 http://www.renfei.org/blog/bipartite-matching.html http://blog.csdn.net/thundermrbird/art ...
- noip 2011
铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺 ...
- psychology
壹.自身(荣.命) 一.职业分析 ㈠.分析性格→分析长处和短处→分析大家都有的长处→确定自己最终发展的专业. 1 .性格--宗正 耐压力特强,即使肩头责任重大,也能够处理得稳稳当当,是 ...
- Samba完整篇 ubuntu 10.04
基本的服务器准备工作 修改Root密码 sudo passwd root 在提示下建立新密码 修改静态IP: sudo gedit /etc/network/interfaces #网络配置文件 ...
- Linux/UNIX之进程环境
进程环境 进程终止 有8种方式使进程终止,当中5中为正常终止,它们是 1) 从main返回 2) 调用exit 3) 调用_exit或_Exit 4) 最后一个 ...
- Android 代码设置Activity 背景透明
当指定Activity 样式 Them.Dialog 时候 又不同意用XML 设置 Activity 的背景颜色的时候 用代码 this.getWindow().getDecorView().setB ...
- c#基于事件模型的UDP通讯框架(适用于网络包编解码)
之前写过一篇关于c#udp分包发送的文章 这篇文章里面介绍的方法是一种实现,可是存在一个缺点就是一个对象序列化后会增大非常多.不利于在网络中的传输. 我们在网络中的传输是须要尽可能的减小传送的数据包的 ...