Elixir UTF-8和Unicode

2023-12-14 16:52 更新

一個(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é)只能表示0255的數(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/1String.length/1返回值不同的原因:"

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

UTF-8要求以一個(gè)字節(jié)來表示heo的代碼點(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ù)!

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)