Преобразовать односимвольную строку в ее код - PullRequest
0 голосов
/ 17 февраля 2019

Я знаю, что могу получить кодовую точку символа, используя синтаксис ?a.

iex> ?a
97

Но как насчет того, когда a является двоичным, "a"?Как я могу получить кодовую точку в этом случае?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Остерегайтесь разложенной формы UTF-8.Всегда безопаснее вызывать String.normalize/2 на входе перед дальнейшей обработкой (передавая :nfc в качестве второго аргумента.)

Можно ожидать, что

<<cp::utf8>> = "á"

будет работать, но он поднимается, в то время как

<<cp::utf8>> = "á"

работает довольно хорошо.Выше нет опечатки, "á" в первом примере и "á" во втором примере отличаются.

"á" == "á"
#⇒ false

Для безопасного сопоставления обоих составныхи декомпозировать, несмотря ни на что, можно явно нормализовать его до составленной формы заранее.

with <<cp::utf8>> <- String.normalize("á", :nfc),
  do: cp
#⇒ 225

Все приведенные выше примеры можно копировать.

"á"
|> String.normalize(:nfc)
|> String.to_charlist()
|> hd()
#⇒ 225

но

"á"
|> String.to_charlist()
|> hd()
#⇒ 97
0 голосов
/ 17 февраля 2019

Вы можете использовать двоичное сопоставление с образцом:

iex(1)> <<codepoint::utf8>> = "a"
"a"
iex(2)> codepoint
97

Или использовать String.to_charlist/1 и извлечь первое значение:

iex> "a" |> String.to_charlist |> hd
97
...