文章插图
前言前段时间发表了Go中的HTTP请求之——HTTP1.1请求流程分析,所以这两天本来打算研究HTTP2.0的请求源码,结果发现太复杂就跑去逛知乎了,然后就发现了一个非常有意思的提问“golang 特殊字符的string怎么转成[]byte?” 。为了转换一下心情, 便有了此篇文章 。
问题原问题我就不码字了,直接上图:
看到问题,我的第一反应是ASCII码值范围应该是0~127呀,怎么会超过127呢?直到实际运行的时候才发现上图的特殊字符是‘?’(如果无法展示,记住该特殊字符的unicode是u0081),并不是英文中的句号 。
unicode和utf-8的恩怨纠葛百度百科已经把unicode和utf-8介绍的很详细了,所以这里就不做过多的阐述,仅摘抄部分和本文相关的定义:
Unicode为每个字符设定了统一并且唯一的二进制编码,通常用两个字节表示一个字符 。UTF-8是针对Unicode的一种可变长度字符编码 。它可以用来表示Unicode标准中的任何字符 。UTF-8的特点是对不同范围的字符使用不同长度的编码 。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同 。go中的字符众所周知,go中能表示字符的有两种类型,分别是byte和rune,byte和rune的定义分别是:type byte = uint8和type rune = int32 。
uint8范围是0-255,只能够表示有限个unicode字符,超过255的范围就会编译报错 。根据上述关于unicode的定义,4字节的rune完全兼容两字节的unicode 。
我们用下面的代码来验证:
var (c1 byte = 'a'c2 byte = '新'c3 rune = '新')fmt.Println(c1, c2, c3)复制代码上述的程序根本无法运行,因为第二行编译会报错,vscode给到了十分详细的提示:’新’ (untyped rune constant 26032) overflows byte 。
接下来,我们通过下面的代码来验证字符和unicode和整型的等价关系:
fmt.Printf("0x%x, %dn", '?', '?') //输出:0x81, 129fmt.Println(0x81 == '?', 'u0081' == '?', 129 == '?') // 输出:true true true//u0081输出到屏幕上后不展示, 所以换了大写字母A来输出fmt.Printf("%cn", 65) // 输出:A复制代码根据上面的代码输出的3个true可以知道,字符和unicode和整形是等价,并且整形也能转回字符的表现形式 。
go中的字符串是utf8编码的根据golang官方博客blog.golang.org/strings的原文:
Go source code is always UTF-8.A string holds arbitrary bytes.A string literal, absent byte-level escapes, always holds valid UTF-8 sequences.复制代码翻译整理过来其实也就是两点:
go中的代码总是用utf8编码,并且字符串能够存储任何字节 。没有经过字节级别的转义,那么字符串是一个标准的utf8序列 。有了前面的基础知识和字符串是一个标准的utf8序列这一结论后我们接下来对字符串“?”(如果无法展示,记住该特殊字符的unicode是u0081)手动编码 。
Unicode到UTF-8的编码方对照表:
字符‘?’(如果无法展示,记住该特殊字符的unicode是u0081)的二进制表示为10000001,16进制表示为0x81 。
根据unicode转utf8的对照表,0x7f < 0x81 < 0x7ff,所以此特殊字符需占两个字节,并且要套用的utf8模版是110xxxxx 10xxxxxx 。
我们按照下面的步骤对10000001转为utf8的二进制序列:
第一步:根据x数量对特殊字符的高位补0 。x的数量是11,所以需要对特殊字符的高位补3个0,此时特殊字符的二进制表示为:00010000001 。
第二步:x有两个部分,且长度分别是5和6,所以对00010000001由底位向高位分别截取6位和5位,得到000001和00010 。
第三步:将000001和00010由低位向高位填充至模版110xxxxx 10xxxxxx,可得到utf8的二进制序列为:11000010 10000001 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- m2ts播放器:怎么把专用播放器的视频转化成普通视频格式?
- edius转场特效设置方法 edius无缝转场教程
- 迅雷格式转换软件:有什么软件可以把从腾讯优酷下载下来的缓存视频转换成手机能识别的格式?
- 直播电商新转折 电商新式直播
- dnf神枪手转职:DNF:神枪手第五职业即将开启?这个NPC是真的帅啊
- 转基因是什么意思:什么是转基因?
- json数据自动生成表格方法 json转excel表格工具
- 二进制转十进制的方法 二进制在线转换成文字
- 二进制转换十六进制方法 C语言十进制转换二进制
- 龙之谷二转任务流程 龙之谷手游转职路线