Остерегайтесь разложенной формы 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