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

Posted

技术标签:

【中文标题】如何在 Erlang 中将重音字符串转换为常规字符串?【英文标题】:How to convert accented strings to regular strings in Erlang? 【发布时间】:2021-10-13 18:29:50 【问题描述】:

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

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

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

关于如何做到这一点的任何线索?

【问题讨论】:

它不能解决你的问题,但你可以把它当作“灵感”:medium.com/grindr-engineering/… 【参考方案1】:
    应用Unicode Canonical Decomposition (NFD) 来重写两个代码点o (U+6F) 中的ó 等字符,后跟unicode:characters_to_nfc_binary/1 的分隔组合重音符号(U+301) 使用正则表达式 \pMn,替换 (re:replace/4) 所有组合变音符号(非空格标记)的所有那些,如上面的 U+301 可选:应用 Unicode 规范组合 (NFC) 将剩余和可能的代码点重新组合在一起
String = "Luperón",
ok, Re = re:compile("\\pMn", [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<\pMn>u, string |> :unicode.characters_to_nfd_binary(), "")
  |> :unicode.characters_to_nfc_binary()

【讨论】:

当问题是特定于 Erlang 时,我不明白为什么要在您的答案中添加 Elixir 代码示例?许多语言都在使用 Erlang 及其底层模块,所以这对我来说不是一个理由。其次:unicode不是基于Erlang,它实际上是一个Erlang Module。 哎呀!!!从答案编辑历史中得到它,看起来你是从 Elixir 代码开始的......很好!我感到很愚蠢:\谢谢你的回答

以上是关于如何在 Erlang 中将重音字符串转换为常规字符串?的主要内容,如果未能解决你的问题,请参考以下文章

将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)

使用 .NET 如何将包含 Latin-1 重音字符的 ISO 8859-1 编码文本文件转换为 UTF-8

如何在 Erlang 中将整数转换为二进制?

使用java将重音字符转换为英文

如何从 .NET 中的字符串中删除变音符号(重音符号)?

如何从 .NET 中的字符串中删除变音符号(重音符号)?