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