如何在 C# 中标准化花哨的 unicode 字符串?

Posted

技术标签:

【中文标题】如何在 C# 中标准化花哨的 unicode 字符串?【英文标题】:How to normalize fancy-looking unicode string in C#? 【发布时间】:2022-01-22 07:56:51 【问题描述】:

例如,我从 REST API 收到具有这种样式的文本

???????????? ?????? ???????????????????????? ??????????????? ??????????????? ??????????????? ??? ???????????????????????????

???????????? ?????? ???????????????????????? ??????????????? ??????????????? ??????????????? ??? ???????????????????????????

нσω тσ яємσνє тнιѕ ƒσηт ƒяσм α ѕтяιηg?

但这不是斜体、粗体或下划线,因为它的类型是字符串。 这种文字使它失败了我的正则表达式^[a-zA-Z0-9._]*$

我想规范化在标准字符串中收到的这个字符串,以使我的正则表达式仍然有效。

【问题讨论】:

很多个可能的字符需要翻译,其中一些替换可能不明确。 这些是 Unicode 字符(例如,第一句的字符来自 this range)。请注意,在第三个中,有希腊语和俄语字符,它们没有明显的拉丁语等价物(有音译规则,但它们应该只适用于用外语书写的文本,而不适用于这种垃圾)。 同意这些 Unicode 字符不会干净地映射回英文的其他答案。 但是,如果您了解有关用于创建它们的服务的更多信息,并且您绝对 100% 有把握地了解这些字符串最初是纯文本英语,并且您ll 从不在任何地方都有真正的非英文文本,您也许能够找出他们的地图并可靠地向后运行。 @JoelCoehoorn 啊,是的,我明白了。如果这来自社交网络消息,则可能会发生这种情况。 How can I normalize fonts? 包含编写解决方案的详细信息,我相信。请参阅Unicode confusables。 【参考方案1】:

您可以使用 Unicode 兼容性规范化形式,它使用 Unicode 自己的(有损)字符映射将类似字母的字符(以及其他内容)转换为其简化的等价物。

以python为例:

>>> from unicodedata import normalize
>>> normalize('NFKD','??? ?? ?????? ???? ???? ???? ? ??????')
'How to remove this font from a string'

# EDIT: This one wouldn't work
>>> normalize('NFKD','нσω тσ яємσνє тнιѕ ƒσηт ƒяσм α ѕтяιηg?')
'нσω тσ яємσνє тнιѕ ƒσηт ƒяσм α ѕтяιηg?'

Interactive example here.

编辑:请注意,这仅适用于文体形式(上标、黑色字母、填充宽度等),因此您的第三个示例使用非拉丁字符,不能分解为 ASCII。

EDIT2:我没有意识到您的问题是针对 C#,here's the documentation for String.Normalize,它就是这样做的:

string s1 = "??? ?? ?????? ???? ???? ???? ? ??????"
string s2 = s1.Normalize(NormalizationForm.FormKD)

【讨论】:

最后一个字符串的示例输出(“нσω тσ яємσνє тнιѕ ƒσηт ƒяσм α ѕтяιηg”)将与显示限制相关。 是的,我是在回复后才知道的。编辑了我的回复。可能没有简单的方法可以从第三个字符串中去除样式,这类似于尝试在那时翻译 leet-speak。您需要一个翻译表来处理所有模糊地看起来像字母的 unicode 字符(但实际上并不是像前两个字符串那样的风格化字母)。 big list of naughty strings 是测试此类事物的绝佳资源。

以上是关于如何在 C# 中标准化花哨的 unicode 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

从其代码中获取 unicode 字符串 - C#

如何判断一个字符串是不是是unicode编码?

java中如何获得一个字符的unicode编码

如何在 PowerShell 字符串文字中编码 Unicode 字符代码?

在 C# 中将上标转换为 Unicode [关闭]

如何替换我只有 unicode 表示的字符?