亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

string轉(zhuǎn)byte類型 字符串轉(zhuǎn)byte數(shù)組


string轉(zhuǎn)byte類型 字符串轉(zhuǎn)byte數(shù)組

文章插圖
前言前段時(shí)間發(fā)表了Go中的HTTP請(qǐng)求之——HTTP1.1請(qǐng)求流程分析,所以這兩天本來(lái)打算研究HTTP2.0的請(qǐng)求源碼,結(jié)果發(fā)現(xiàn)太復(fù)雜就跑去逛知乎了,然后就發(fā)現(xiàn)了一個(gè)非常有意思的提問(wèn)“golang 特殊字符的string怎么轉(zhuǎn)成[]byte?” 。為了轉(zhuǎn)換一下心情, 便有了此篇文章 。
問(wèn)題原問(wèn)題我就不碼字了,直接上圖:
看到問(wèn)題,我的第一反應(yīng)是ASCII碼值范圍應(yīng)該是0~127呀,怎么會(huì)超過(guò)127呢?直到實(shí)際運(yùn)行的時(shí)候才發(fā)現(xiàn)上圖的特殊字符是‘?’(如果無(wú)法展示,記住該特殊字符的unicode是u0081),并不是英文中的句號(hào) 。
unicode和utf-8的恩怨糾葛百度百科已經(jīng)把unicode和utf-8介紹的很詳細(xì)了,所以這里就不做過(guò)多的闡述,僅摘抄部分和本文相關(guān)的定義:
Unicode為每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,通常用兩個(gè)字節(jié)表示一個(gè)字符 。UTF-8是針對(duì)Unicode的一種可變長(zhǎng)度字符編碼 。它可以用來(lái)表示Unicode標(biāo)準(zhǔn)中的任何字符 。UTF-8的特點(diǎn)是對(duì)不同范圍的字符使用不同長(zhǎng)度的編碼 。對(duì)于0x00-0x7F之間的字符,UTF-8編碼與ASCII編碼完全相同 。go中的字符眾所周知,go中能表示字符的有兩種類型,分別是byte和rune,byte和rune的定義分別是:type byte = uint8和type rune = int32 。
uint8范圍是0-255,只能夠表示有限個(gè)unicode字符,超過(guò)255的范圍就會(huì)編譯報(bào)錯(cuò) 。根據(jù)上述關(guān)于unicode的定義,4字節(jié)的rune完全兼容兩字節(jié)的unicode 。
我們用下面的代碼來(lái)驗(yàn)證:
var (c1 byte = 'a'c2 byte = '新'c3 rune = '新')fmt.Println(c1, c2, c3)復(fù)制代碼上述的程序根本無(wú)法運(yùn)行,因?yàn)榈诙芯幾g會(huì)報(bào)錯(cuò),vscode給到了十分詳細(xì)的提示:’新’ (untyped rune constant 26032) overflows byte 。
接下來(lái),我們通過(guò)下面的代碼來(lái)驗(yàn)證字符和unicode和整型的等價(jià)關(guān)系:
fmt.Printf("0x%x, %dn", '?', '?') //輸出:0x81, 129fmt.Println(0x81 == '?', 'u0081' == '?', 129 == '?') // 輸出:true true true//u0081輸出到屏幕上后不展示, 所以換了大寫(xiě)字母A來(lái)輸出fmt.Printf("%cn", 65) // 輸出:A復(fù)制代碼根據(jù)上面的代碼輸出的3個(gè)true可以知道,字符和unicode和整形是等價(jià),并且整形也能轉(zhuǎn)回字符的表現(xiàn)形式 。
go中的字符串是utf8編碼的根據(jù)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.復(fù)制代碼翻譯整理過(guò)來(lái)其實(shí)也就是兩點(diǎn):
go中的代碼總是用utf8編碼,并且字符串能夠存儲(chǔ)任何字節(jié) 。沒(méi)有經(jīng)過(guò)字節(jié)級(jí)別的轉(zhuǎn)義,那么字符串是一個(gè)標(biāo)準(zhǔn)的utf8序列 。有了前面的基礎(chǔ)知識(shí)和字符串是一個(gè)標(biāo)準(zhǔn)的utf8序列這一結(jié)論后我們接下來(lái)對(duì)字符串“?”(如果無(wú)法展示,記住該特殊字符的unicode是u0081)手動(dòng)編碼 。
Unicode到UTF-8的編碼方對(duì)照表:
字符‘?’(如果無(wú)法展示,記住該特殊字符的unicode是u0081)的二進(jìn)制表示為10000001,16進(jìn)制表示為0x81 。
根據(jù)unicode轉(zhuǎn)utf8的對(duì)照表,0x7f < 0x81 < 0x7ff,所以此特殊字符需占兩個(gè)字節(jié),并且要套用的utf8模版是110xxxxx 10xxxxxx 。
我們按照下面的步驟對(duì)10000001轉(zhuǎn)為utf8的二進(jìn)制序列:
第一步:根據(jù)x數(shù)量對(duì)特殊字符的高位補(bǔ)0 。x的數(shù)量是11,所以需要對(duì)特殊字符的高位補(bǔ)3個(gè)0,此時(shí)特殊字符的二進(jìn)制表示為:00010000001 。
第二步:x有兩個(gè)部分,且長(zhǎng)度分別是5和6,所以對(duì)00010000001由底位向高位分別截取6位和5位,得到000001和00010 。
第三步:將000001和00010由低位向高位填充至模版110xxxxx 10xxxxxx,可得到utf8的二進(jìn)制序列為:11000010 10000001 。


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!

「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助: