C#使用StringInfo正确查找字符个数

本文介绍了在C#中遇到的一个问题:程序在计算字符串长度时,由于Unicode编码中某些字符(如emoji)由两个单元组成,导致计数不准确。通过使用`StringInfo`类,可以正确地获取字符串实际显示的字符个数,并提供了如何枚举显示字符的方法。文章还提供了相关参考资料和博客链接。
摘要由CSDN通过智能技术生成

之前在处理文本的时候遇到过这样的一个问题,有的字,它看着是一个,但是程序说他是两个,但是实际真的是一个。
好吧,你们一定没有听懂我在讲什么。没关系一起来看看代码


假如有这么一个字符串“黄腾霄好瘦哦”,需要使用程序找出这个字符串包含几个字,怎么找?

var s=“黄腾霄好瘦哦”;
var len=s.Length;

很简单是不是。那再看看这个字符串,“黄腾霄也能算瘦🤔”,不出意料的话应该是8个字对吧?

我们看看上一个程序的输出。

在这里插入图片描述

惊了,他居然输出了长度为9。

实际上这个地方的问题出在最后一个emoji上。

让我们先看看这个字符串的Unicode编码是什么样的。

在这里插入图片描述

我们看到这个8个字符的字符串实际上包含了9个Unicode。

在这里插入图片描述
而其中整个emoji字符🤔,实际是由2个Unicode字符拼接而成的。

实际上对于“U+D800-U+DFFF”中的值是作为代理字符对存在的,他们会将两个字符映射成为一个字符。

所以在Unicode编码上是2个,而显示上却只有一个。而我们的String.Length恰好就只是读Unicode编码的个数。

所以才会出现多一个的情况。

那么怎么办呢?我们看看下面这个代码

var s 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值