W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
一個(gè)字符串是一段UTF-8編碼的二進(jìn)制數(shù)。為了理解它們,我們首先需要明白字節(jié)與代碼點(diǎn)的區(qū)別。
Unicode標(biāo)準(zhǔn)將代碼點(diǎn)賦值給許多我們熟知的字符。例如,字母a
擁有代碼點(diǎn)97
,字母?
擁有代碼點(diǎn)322
。當(dāng)將字符串"he??o"
寫入磁盤時(shí),我們需要將代碼點(diǎn)轉(zhuǎn)換為字節(jié)。如果我們遵守一個(gè)字節(jié)代表一個(gè)代碼點(diǎn)的規(guī)則,那么我們就不能寫入"he??o"
,因?yàn)?code>?的代碼點(diǎn)是322
,而一個(gè)字節(jié)只能表示0
到255
的數(shù)字。但我們總有辦法表示"he??o"
,這就是編碼在發(fā)揮作用。
當(dāng)用字節(jié)來表示代碼點(diǎn)時(shí),我們需要對(duì)它們進(jìn)行編碼。Elixir選擇UTF-8編碼作為其主要和默認(rèn)的編碼。當(dāng)我們說一個(gè)字符串是UTF-8編碼的二進(jìn)制數(shù),那意味著它是一串通過UTF-8編碼來代表特定代碼點(diǎn)的字節(jié)。我們需要不止一個(gè)字節(jié)來代表例如?
的322
這樣的代碼點(diǎn)。這就是byte_size/1
與String.length/1
返回值不同的原因:"
iex> string = "he??o
"he??o"
iex> byte_size(string)
7
iex> String.length(string)
5
UTF-8要求以一個(gè)字節(jié)來表示h
,e
和o
的代碼點(diǎn),以兩個(gè)字節(jié)表示?
的。在Elixir中,你可以通過?
來得到代碼點(diǎn)的值:
iex> ?a
97
iex> ??
322
你也可以使用String
模塊中的函數(shù)來依照代碼點(diǎn)分割一個(gè)字符串:
iex> String.codepoints("he??o")
["h", "e", "?", "?", "o"]
你會(huì)發(fā)現(xiàn)Elixir對(duì)于字符串操作有著良好的支持。事實(shí)上,Elixir將所有測試內(nèi)容放到了文章“字符串類型崩潰了”中。
然而,字符串只是故事的一部分。我們通過is_binary/1
得知字符串是二進(jìn)制數(shù),所以Elixir一定是以一種底層類型控制著字符串。讓我們來討論一下二進(jìn)制數(shù)!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: