Go語言中的字元和字串

2022-01-12 15:12:24 字數 1599 閱讀 2631

在go語言中,沒有字元型別,字元型別是rune型別,rune是int32的別稱。

下面用乙個簡單的程式來演示字元型別:

package main

import (

"fmt"

"reflect"

)func main()

程式輸出:

'我'的型別為:%!t(int32=25105) 二進位制為:110001000010001

r的實際型別為:int32

go語言天生支援unicode,那我產生乙個問題:unicode字元的長度是多少?

這個問題的問法有沒有問題?其實仔細想想,這樣問是有問題的。首先,unicode的基礎是乙個有編號的字符集,在字符集之上又規定了模組化的編碼等等技術層次,各種具體的編碼形式並不一致。因此,嚴格來說,unicode是沒有「長度」這一說的,它是抽象的字元,只有unicode的編碼才有具體的位元組長度。而且不同的編碼實現,長度也不一樣。

unicode 目前規劃的總空間是17個平面(平面0至16),每個平面有 65536 個碼點。我們常用的平面0(「basic multilingual plane」,即「bmp」)碼點範圍為0x0000 至 0xffff,這並不是 unicode 的全部。

bmp 的字元是 unicode 中最基礎和最常用的一部分,以 utf-16 編碼時使用2位元組,以 utf-8編碼時使用1至3位元組。超出 bmp 的字元以 utf-16 或 utf-8 編碼都需要4位元組。另外還有乙個比較少用的編碼形式,utf-32,它編碼任何 unicode 字元都需要4個位元組。

go語言的字串有兩種方式來表示:

s := `go原格式字串

可以跨行`

go語言的字串是以utf-8格式編碼並儲存的,下面有乙個簡單的例子:

package main

import (

"fmt"

)func main()

}

程式輸出:

s的型別為:%!t(string=我), 長度為:3, 16進製為:e68891

第0個位元組為:11100110

第1個位元組為:10001000

第2個位元組為:10010001

變數s中存放的是這個字串的utf-8編碼,當你使用len(s)函式獲取字串的長度時,獲取的是該字串的utf-8編碼長度,儲存乙個字元可能需要 2個、3個或者4個位元組,它是不固定的。

utf-8的編碼遵循如下2條規則:

根據這兩條簡單的規則,我們可以把utf-8編碼轉換為unicode的碼點:

//utf8轉為unicode

1110 0110 1000 1000 1001 0001 // s

0110 00 1000 01 0001 // s utf8 -> unicode

0000 0000 0110 0010 0001 0001 // s utf8 -> unicode

0000 0000 0000 0000 0110 0010 0001 0001 // r

我們可以看到上面推導的結果跟程式的輸出結果相符。

C語言中的字串和字元陣列

1 字元陣列的定義與初始化 字元陣列的初始化,最容易理解的方式就是逐個字元賦給陣列中各元素。char str 10 即把10個字元分別賦給str 0 到str 9 10個元素 如果花括號中提供的字元個數大於陣列長度,則按語法錯誤處理 若小於陣列長度,則只將這些字元陣列中前面那些元素,其餘的元素自動定...

c語言中的字元和字串的關係

c語言學得一般,最近對字元和字串有點搞混了,就來複習一下。1.字元 用關鍵字char來定義,例如 char c1 char c2 並且c1,c2裡只能儲存乙個字元。字元在所有的編譯系統都只佔乙個位元組,並用ascii碼來儲存。例如字元a的ascii碼是97,char c1 a pirintf d c...

Pascal 語言中字元與字串

題目 輸入一段文章 255個字元以內 求文章中單詞的個數,相同單詞只記一次,the 和 the 視作相同。敲 vararticle,w string arr array 1.255 of string i,len,ans longint function check w string boolean...