如何在C#中标准化外观精美的Unicode字符串?

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

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

  • 𝓗𝓸𝔀𝓻𝓮𝓶𝓸𝓿𝓮]?

  • 𝐻𝑜𝓌𝓇𝑒𝓂𝑜𝓋𝑒]?

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

失败

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

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

您可以使用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#的,String.Normalize的here's the documentation就是这样:

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