提问人:Luigi Saggese 提问时间:5/23/2020 最后编辑:Wiktor StribiżewLuigi Saggese 更新时间:10/13/2023 访问量:1967
如何在C#中规范化看起来很花哨的unicode字符串?
How to normalize fancy-looking unicode string in C#?
问:
例如,我从 REST API 接收具有这种样式的文本
如何从字符串中删除此字体?
如何从字符串中删除此字体?
нσω тσ яємσνє тнιѕ ƒσηт ƒяσм α ѕтяιηg?
但这不是斜体、粗体或下划线,因为它的类型是字符串。
这种文字使我的正则表达式失败^[a-zA-Z0-9._]*$
我想对标准字符串中收到的这个字符串进行规范化,以使我的正则表达式仍然有效。
答:
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
测试这种东西的一个很好的资源是一大堆顽皮的字符串。
评论