如何在C#中规范化看起来很花哨的unicode字符串?

How to normalize fancy-looking unicode string in C#?

提问人:Luigi Saggese 提问时间:5/23/2020 最后编辑:Wiktor StribiżewLuigi Saggese 更新时间:10/13/2023 访问量:1967

问:

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

  • 如何从字符串中删除此字体?

  • 如何从字符串中删除此字体?

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

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

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

C# 字符串 Unicode

评论

4赞 Karl Knechtel 5/23/2020
有很多可能的字符需要翻译,并且某些替换字符可能模棱两可。
4赞 5/23/2020
这些是 Unicode 字符(例如,第一句包含此范围的字符)。请注意,在第三个字符中,有希腊语和俄语字符,它们没有明显的拉丁语对应物(有音译规则,但它们应该仅适用于用外语编写的文本,而不适用于这些垃圾)。
2赞 Joel Coehoorn 5/23/2020
同意其他答案,即这些 Unicode 字符不会干净地映射回英语。但是,如果您了解有关用于创建它们的服务的更多信息,并且您知道,您绝对 100% 确信这些字符串最初是纯文本英语,并且您在任何地方都不会有真正的非英语文本,您可以找到它们的地图并可靠地向后运行它们。
1赞 5/23/2020
@JoelCoehoorn啊,是的,我明白了。如果这来自社交网络消息,则可能会发生这种情况。
2赞 Wiktor Stribiżew 5/23/2020
如何规范化字体?我相信,包含编写解决方案的详细信息。请参阅 Unicode 混淆。

答:

23赞 VLRoyrenn 5/23/2020 #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?'

此处为交互式示例。

请注意,这仅适用于样式形式(上标、黑体字、填充宽度等),因此使用非拉丁字符的第三个示例无法分解为 ASCII。

对于 C#,下面是 String.Normalize 的文档,它就是这样做的:

string s1 = "𝓗𝓸𝔀 𝓽𝓸 𝓻𝓮𝓶𝓸𝓿𝓮 𝓽𝓱𝓲𝓼 𝓯𝓸𝓷𝓽 𝓯𝓻𝓸𝓶 𝓪 𝓼𝓽𝓻𝓲𝓷𝓰";
string s2 = s1.Normalize(NormalizationForm.FormKD);

评论

5赞 user2864740 5/23/2020
最后一个字符串的示例输出 (“нσω тσ яємσνє тнιѕ ƒσηт ƒяσм α ѕтяιηg”) 将与显示限制相关。
5赞 VLRoyrenn 5/23/2020
是的,我是在回复后才意识到的。编辑了我的回复。可能没有简单的方法可以从第三根弦上剥离样式,这类似于在这一点上尝试翻译 leet-speak。您需要一个翻译表来翻译所有看起来模糊像字母的 unicode 字符(但实际上不像前两个字符串那样是程式化的字母)。
2赞 Moshe Katz 5/27/2020
测试这种东西的一个很好的资源是一大堆顽皮的字符串