如何在 C# 中规范化漂亮的 unicode 字符串?

Lui*_*ese 21 c# string unicode

例如,我从 REST API 收到了具有这种风格的文本

  • ?

  • ?

  • ????? ????????????? ???? ? ?????G?

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

我想标准化在标准字符串中收到的这个字符串,以使我的 Regex 仍然有效。

VLR*_*enn 19

您可以使用 Unicode Compatibility 规范化形式,它使用 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?'
Run Code Online (Sandbox Code Playgroud)

交互式示例在这里。

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

EDIT2:我没有意识到您的问题是特定于 C# 的,这里是String.Normalize的文档,它就是这样做的:

string s1 = "       "
string s2 = s1.Normalize(NormalizationForm.FormKD)
Run Code Online (Sandbox Code Playgroud)

  • 最后一个字符串的示例输出(“нσω тσ яємσνє тнιѕ ƒσηт сяσм α ѕтяιηg”)将与显示限制相关。 (5认同)
  • 是的,我是在回复之后才意识到这一点。编辑了我的回复。可能没有简单的方法可以从第三个字符串中去除样式,这类似于尝试翻译此时的 leet-speak。您需要一个用于所有看起来像字母的 unicode 字符的翻译表(但实际上并不是像前两个字符串那样的风格化字母)。 (5认同)
  • 测试此类事情的一个很好的资源是[顽皮字符串大列表](https://github.com/minimaxir/big-list-of-naughty-strings)。 (2认同)