如何在 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)