如何在Erlang中将重音字符串转换为常规字符串?

uklbhaso  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(156)

我想将一些带有重音字符的城市名称转换为普通字符串。例如:

<<"Sosúa">>  to  <<"Sosua">>

<<"Luperón">> to <<"Luperon">>

有什么线索吗?

siv3szwd

siv3szwd1#

1.应用Unicode Canonical Decomposition (NFD)重写两个代码点o(U+6 F)中的字符,如ó,后跟一个分隔的组合锐音符(U+301)和unicode:characters_to_nfc_binary/1
1.使用regexp \p{Mn}替换(re:replace/4)所有组合音调符号(非空格标记),如上面的U+301
1.可选项:应用Unicode规范组合(NFC)将剩余的和可能的代码点重新组合在一起

String = "Luperón",
{ok, Re} = re:compile("\\p{Mn}", [unicode]),
Output = unicode:characters_to_nfc_binary(
  re:replace(
    unicode:characters_to_nfd_binary(String),
    Re,
    "",
    [global]
  )
),
Output.

与Elixir等效,用于参考和信息(因为它也基于Erlang的unicode模块):

string = "Luperón"
output = 
  Regex.replace(~R<\p{Mn}>u, string |> :unicode.characters_to_nfd_binary(), "")
  |> :unicode.characters_to_nfc_binary()

相关问题