在C#中处理字符簇

前言

在这之前首先感谢我的朋友:netero,是他给了我很多帮助完成了这份代码。

因为我们在一起处理一些文本的时候发现,对于一些特殊的字符我们无法准确的得到我们想要的长度。于是查阅了很多资料和相关的代码,本以为已经解决了这个问题,可是发现GitHub上的一些代码并不能正确的得到结果。因为他们的代码大多数是按照Unicode 10.0.0的文档编写的,然而现在已经是 Unicode 14.0.0的版本了,于是自己动手。。

项目地址:https://github.com/DebugST/STGraphemeSplitter

案例

在我们编写代码的时候会经常对字符串进行处理。比如:获取字符串长度,获取某个索引所在的字符。

string strText = "abc";
Console.WriteLine(strText.Length) // output is: 3

//但是...当有一些特殊字符的时候...比如emoji表情的时候。。

string strText = "👩‍🦰👩‍👩‍👦‍👦🏳️‍🌈";
Console.WriteLine(strText.Length) // output is: 22

可视我们希望的结果是3,但是结果却输出了22。。这是为什么?

字素簇

注意这里是字素而不是字数

字素簇 (grapheme cluster) 指人直觉和认知上所认为是单个字符的文本元素。字素簇可能就是一个抽象字,也可能由多个抽象字组成。字素簇应当是文本操作的基本单位。

之所以会出现这样的情况是:在众多的编译器,或者内存中。字符都是以Unicode编码的。所以在统计长度的时候是统计的Unicode编码个数
众所周知,一个Unicode是两字节,即便全部用来做字符编码区间也仅仅是0x0000-0xFFFF也就是65536个字符,这个区间可能中国的汉字都装不下。

编码区间

所以Unicoe组织想到了一个办法,那就是代理。Unicode组织并不打算把0x0000-0xFFFF全部作为字符区间

所以这个时候Unicode组织决定拿出2048个字符区间作为代理字符。

分别是 0xD800-0xDBFF 是高代理字符。。0xDC00-0xDFFF 是低代理字符

高代理字符之后通常跟随低代理字符,它们的编码分别取出最后10位组合后再加0x10000成新的编码,这样就可以有更多的字符组合,多达1048576种。

所以这样的字符需要两个Unicode字符组成。

private static int GetCodePoint(<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值