如何在 C# 中规范化外观精美的 unicode 字符串?

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

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

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

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

您可以使用 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)