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个比 ...
随机推荐
- mariadb,maria db
mariadb,maria db 继续紧逼Oracle:在占领谷歌等公司之后,MariaDB迈向企业端 发表于2013-10-25 13:00|10618次阅读|10条评论 MariaDB在Googl ...
- poj3440--Coin Toss(几何上的概率)
Coin Toss Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3946 Accepted: 1076 Descrip ...
- openjudge1944 吃糖果
描述名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0).妈妈告诉名名每天可以吃一块或者两块巧克力.假设名名每天都吃巧克力,问名名共有多 ...
- ios截屏事件监听
目的:实现截屏反馈,类似支付宝的截屏上传反馈功能. 1.注册全局通知,在Appdelegate中注册截屏监听通知 - (void)registNotification{ [[NSNotificatio ...
- 英特尔固态盘 说明书PDF
http://www.intel.cn/content/www/cn/zh/solid-state-drives/solid-state-drives-ssd.html
- JButton点击事件
JButton点击事件: 以前都是搞一个JFrame,放个JButton,然后用鼠标点击: 忽然之间: import javax.swing.JButton; public class Page06 ...
- vsftpd.conf案例
1. 匿名服务器的连接(独立的服务器) 在/etc/vsftpd/vsftpd.conf配置文件中添加如下几项:Anonymous_enable=yes (允许匿名登陆)Dirmessage_enab ...
- Android 4.4环境搭建——配置AVD模拟器
AVD(Android Virtual Device)即Android模拟器,它是Android官方提供的一个能够执行Android程序的虚拟机,在执行Android程序之前,首先须要创建AVD模拟器 ...
- Servlet之中文乱码问题【入门版】
请求数据的中文问题 1 post请求提交中文 get请求建议不提交中文(只是也有方法解决) 1.1post request.setCharacterEncoding("utf-8" ...
- java图片处理工具之-ImageMagick+jmagick(二)
简单的图片处理測试类: public class ImageUtil { static{ System.setProperty("jmagick.systemclassl ...