rune

Unicode

Unicode統(tǒng)一碼又稱為萬(wàn)國(guó)碼或單一碼,是計(jì)算機(jī)科學(xué)領(lǐng)域中的一項(xiàng)業(yè)界標(biāo)準(zhǔn),包含字符集、編碼方案等。

Unicode統(tǒng)一碼是為了解決傳統(tǒng)字符編碼方案的局限而產(chǎn)生,它為每種語(yǔ)言中每個(gè)字符設(shè)定了統(tǒng)一且唯一的二進(jìn)制編碼,以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換和處理的要求。

Unicode統(tǒng)一碼是基于通用字符集(Universal Character Set)標(biāo)準(zhǔn)發(fā)展而來(lái)的,Unicode字符集簡(jiǎn)稱為UCS(Unicode Character Set),早期的Unicode標(biāo)準(zhǔn)有UCS-2、UCS-4說(shuō)法。

Unicode編碼系統(tǒng)可分為編碼方式和實(shí)現(xiàn)方式兩個(gè)層次

編碼方式上,Unicode是國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案,采用數(shù)字0到0x10FFFF來(lái)映射所有的字符,最多可容納1114112個(gè)字符。從數(shù)字0開(kāi)始為每個(gè)符號(hào)會(huì)指定一個(gè)編號(hào),這個(gè)編號(hào)叫做Code Point,翻譯為碼元、碼位、碼點(diǎn)都有,都是指可以分配給字符的數(shù)字。碼點(diǎn)規(guī)定使用U+隨后緊接著十六進(jìn)制數(shù)來(lái)表示。

例如:Unicode碼點(diǎn)0的符號(hào)是null,表示所有二進(jìn)制位都是0。

U+0000 = null

目前最新版的Unicode7.0共收錄了109449個(gè)符號(hào),中日韓文字位74500個(gè),東南亞文字占了全球現(xiàn)有符號(hào)的2/3。如此多的符號(hào)Unicode并不是一次性定義的,而是采用分區(qū)定義的方式。規(guī)定每個(gè)區(qū)可存放65536個(gè)字符,一個(gè)區(qū)又稱為一個(gè)平面(plane),目前共有17個(gè)平面。在所有字符為最前面的65535個(gè)字符位稱為基本平面(BMP),碼點(diǎn)范圍從0到65535,十六進(jìn)制表示從U+0000到U+FFFF。基本平面存放著最常用的字符,這也是Unicode最先定義和公布的一個(gè)平臺(tái)。剩余字符都存放在輔助平面(SMP),碼點(diǎn)范圍U+010000到U+10FFFF。

實(shí)現(xiàn)方式上,Unicode指規(guī)定了每個(gè)字符的碼點(diǎn),具體采用什么樣的字節(jié)序表示碼點(diǎn)就涉及到了編碼方法。編碼方式目的將數(shù)字表示為程序中數(shù)據(jù),最直觀的編碼方法是每個(gè)碼點(diǎn)使用4個(gè)字節(jié)表示,字節(jié)內(nèi)容一一對(duì)應(yīng)碼點(diǎn),這種編碼方法就叫做UTF-32。

比如:碼點(diǎn)0的UTF-32表示方式

U+0000 = 0x00 00 00 00

UTF-32編碼方案的優(yōu)點(diǎn)在于,轉(zhuǎn)換規(guī)則簡(jiǎn)單直觀,查找效率高,時(shí)間復(fù)雜度O(1)。缺點(diǎn)在于浪費(fèi)空間,同樣內(nèi)容的英文文本會(huì)比ASCII編碼大4倍。這個(gè)缺點(diǎn)很致命,導(dǎo)致實(shí)際上沒(méi)有人使用,比如HTML5標(biāo)準(zhǔn)就明文規(guī)定,網(wǎng)頁(yè)編碼不得采用UTF-32。


UTF是UCS Transformation Format的縮寫,翻譯為Unicode字符集轉(zhuǎn)換格式,即怎樣將Unicode定義的數(shù)字轉(zhuǎn)換稱為程序數(shù)據(jù)。

UTF-8

為了節(jié)省空間就導(dǎo)致了UTF-8的誕生,UTF-8是一種變長(zhǎng)的編碼方法,字符長(zhǎng)度從1個(gè)字節(jié)到4個(gè)字節(jié)不等。越是常用的字符,字節(jié)越短,最前面的128個(gè)字符只使用1個(gè)字節(jié)表示,與ASCII碼完全相同。

UTF-8又稱為8位元,是針對(duì)Unicode的一種可變長(zhǎng)度字符編碼??梢杂脕?lái)表示Unicode標(biāo)準(zhǔn)中的任何字符,其編碼中的第一個(gè)字節(jié)仍與ASCII相容。

UTF-8使用1到4個(gè)字節(jié)為每個(gè)字符編碼

  • 一個(gè)ASCII字符,只需要1字節(jié)編碼。
  • 帶變音符號(hào)的拉丁文、希臘文、西里爾等字母,需要2字節(jié)編碼。
  • 中日韓文字、東南亞文字、中東文字等包含大量常用字,需要3字節(jié)編碼。
  • 極少使用的語(yǔ)言會(huì)使用4字節(jié)編碼

byte

字節(jié)是計(jì)算機(jī)用于計(jì)量存儲(chǔ)容量的一種單位,是二進(jìn)制數(shù)據(jù)的單位,一個(gè)字節(jié)通常8位長(zhǎng)。Go語(yǔ)言中byteuint8類型的別名,一個(gè)字節(jié)存儲(chǔ)8位無(wú)符號(hào)數(shù),存儲(chǔ)的數(shù)值范圍從0到255。byte可用于表示ASCII碼表中的一個(gè)字符,傳統(tǒng)ASCII編碼的字符每個(gè)只占1字節(jié)。

數(shù)據(jù)類型 別名 數(shù)據(jù)范圍 描述
uint8 byte 0~255 可表示ASCII字符

例如:ASCII碼表中大寫字母A對(duì)應(yīng)的十進(jìn)制數(shù)值為65,對(duì)應(yīng)十六進(jìn)制數(shù)值為41。

var b byte = 65
fmt.Printf("ascii = %v, unicode = %U, char = %c, hex = %x\n", b, b, b, b)
// ascii = 65, unicode = U+0041, char = A, hex = 41

注意:格式化說(shuō)明符%c表示字符(char),當(dāng)與字符配合使用時(shí)%v%d會(huì)輸出字符對(duì)應(yīng)的整數(shù),%U輸出格式為U+hhhh的字符串。

char

和其它語(yǔ)言不同的是Go語(yǔ)言中沒(méi)有字符這種數(shù)據(jù)類型,字符只是整數(shù)的特殊用例。在Go中具兩個(gè)用來(lái)表示字符的整型別名分別是byterune。

type byte = uint8
type rune = int32
  • byteuint8的別名,長(zhǎng)度為1個(gè)字節(jié),用來(lái)表示ASCII字符。
  • runeint32的別名,長(zhǎng)度為4個(gè)字節(jié),用來(lái)表示UTF-8編碼的Unicode。

既然byterune都能表示字符,為什么還需要兩種呢?由于byte占用1個(gè)字節(jié),因此可用來(lái)表示ASCII字符。Go默認(rèn)編碼方式為UTF-8,UTF-8采用的是變長(zhǎng)的編碼方式,字符長(zhǎng)度從1到4個(gè)字節(jié)不等。對(duì)于具有2個(gè)字節(jié)以上的字符,此時(shí)byte就無(wú)能無(wú)力了。因此就需要rune。

string

Go語(yǔ)言中字符串string本質(zhì)上是一個(gè)只讀的字節(jié)切片,由于是只讀的因此字符串內(nèi)容一旦被創(chuàng)建是不能被修改的。如需修改需將字符串先轉(zhuǎn)換為[]byte字節(jié)切片或[]rune符文切片再操作。

當(dāng)使用for...range遍歷字符串時(shí),Go會(huì)自動(dòng)將字符串轉(zhuǎn)換為[]rune后再執(zhí)行遍歷,即按字符遍歷。而使用for循環(huán)字符串時(shí),不會(huì)發(fā)生自動(dòng)轉(zhuǎn)換,默認(rèn)會(huì)按字節(jié)遍歷。

例如:按字節(jié)遍歷字符串

s := "字符串str"
for i := 0; i < len(s); i++ {
    fmt.Printf("%+v %c\n", s[i], s[i])
}
229 ?
173 -
151 ?
231 ?
172 ?
166 |
228 ?
184 ?
178 2
115 s
116 t
114 r

例如:按字符遍歷字符串

//字符遍歷
s := "字符串str"
for i, v := range s {
    fmt.Println(i, v, fmt.Sprintf("%c", v))
}
0 23383 字
3 31526 符
6 20018 串
9 115 s
10 116 t
11 114 r
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容