string转byte类型 字符串转byte数组


string转byte类型 字符串转byte数组

文章插图
前言前段时间发表了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 。
【string转byte类型 字符串转byte数组】我们按照下面的步骤对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小编还为您精选了以下内容,希望对您有所帮助: