Elixir UTF-8和Unicode

2023-12-14 16:52 更新

一個字符串是一段UTF-8編碼的二進制數(shù)。為了理解它們,我們首先需要明白字節(jié)與代碼點的區(qū)別。

Unicode標(biāo)準(zhǔn)將代碼點賦值給許多我們熟知的字符。例如,字母a擁有代碼點97,字母?擁有代碼點322。當(dāng)將字符串"he??o"寫入磁盤時,我們需要將代碼點轉(zhuǎn)換為字節(jié)。如果我們遵守一個字節(jié)代表一個代碼點的規(guī)則,那么我們就不能寫入"he??o",因為?的代碼點是322,而一個字節(jié)只能表示0255的數(shù)字。但我們總有辦法表示"he??o",這就是編碼在發(fā)揮作用。

當(dāng)用字節(jié)來表示代碼點時,我們需要對它們進行編碼。Elixir選擇UTF-8編碼作為其主要和默認(rèn)的編碼。當(dāng)我們說一個字符串是UTF-8編碼的二進制數(shù),那意味著它是一串通過UTF-8編碼來代表特定代碼點的字節(jié)。我們需要不止一個字節(jié)來代表例如?322這樣的代碼點。這就是byte_size/1String.length/1返回值不同的原因:"

iex> string = "he??o
"he??o"
iex> byte_size(string)
7
iex> String.length(string)
5

UTF-8要求以一個字節(jié)來表示h,eo的代碼點,以兩個字節(jié)表示?的。在Elixir中,你可以通過?來得到代碼點的值:

iex> ?a
97
iex> ??
322

你也可以使用String模塊中的函數(shù)來依照代碼點分割一個字符串:

iex> String.codepoints("he??o")
["h", "e", "?", "?", "o"]

你會發(fā)現(xiàn)Elixir對于字符串操作有著良好的支持。事實上,Elixir將所有測試內(nèi)容放到了文章“字符串類型崩潰了”中。

然而,字符串只是故事的一部分。我們通過is_binary/1得知字符串是二進制數(shù),所以Elixir一定是以一種底層類型控制著字符串。讓我們來討論一下二進制數(shù)!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號