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

问题描述 投票:9回答:1

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

  • нω σ тσ я я я я я я я я я я я я я я я я я я я ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф ф

但这不是斜体、粗体或下划线,因为它的类型是字符串。^[a-zA-Z0-9._]*$

我想把收到的这个字符串规范化为一个标准的字符串,以使我的Regex仍然有效。

c# regex string unicode string-matching
1个回答
18
投票

你可以使用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?'

交互式的例子在这里。

EDIT:注意,这只适用于样式形式(上标、黑字、填充宽度等),所以你的第三个例子,使用非拉丁字符,不能分解为ASCII。

EDIT2:我不知道你的问题是针对C#的。这里是文档 for String.Normalize,它就是这样做的。

string s1 = "𝓗𝓸𝔀 𝓽𝓸 𝓻𝓮𝓶𝓸𝓿𝓮 𝓽𝓱𝓲𝓼 𝓯𝓸𝓷𝓽 𝓯𝓻𝓸𝓶 𝓪 𝓼𝓽𝓻𝓲𝓷𝓰"
string s2 = s1.Normalize(NormalizationForm.FormKD)
© www.soinside.com 2019 - 2024. All rights reserved.