长文本拆分
长文本拆分
TL;DR
- 企业微信消息长度限制为2048个字节,字符长度不等于字节长度
- 使用字节拆分,会导致中文字符被截断
- 使用文本+字节拆分,无法处理emoji表情
- 使用unicode字符拆分,即可解决以上问题
先前在做企业微信的应用接入ChatGPT时遇到一个问题,就是企业微信的消息长度限制为2048个字节,所以遇到超长文本的时候需要拆分成多条消息发送。
🚫方法1
起先想到的就是直接使用文本的长度拆分,但是很明显的问题是,文本的长度并不等于字节的长度,因为中文字符的长度是2或者3个字节,而英文字符的长度是1个字节,按照文本长度拆出来的内容往往就超过了2048个字节的限制。
var text = "假设这是一段超长的文本,超过了2048个字节"; foreach(var chunk in text.Chunk(10)){ new string(chunk).Dump(); } /* output: 假设这是一段超长的文 本,超过了2048个 字节 */
🤷♂️方法2
虽然按照字符的长度去拆分不可靠的话,那就需要按照字节的长度去拆分,但是这样又会导致中文字符被截断,所以就需要在拆分的时候,判断当前字符的字节长度,然后去拆分。
var text = "假设这是一段超长的文本,超过了2048个字节"; var stringBuilder = new StringBuilder(); var limit = 10; var bytes = 0; foreach (var c in text) { var bc = Encoding.UTF8.GetByteCount(c.ToString()); if (bytes + bc > limit) { stringBuilder.ToString().Dump(); stringBuilder.Clear(); bytes = 0; } bytes += bc; stringBuilder.Append(c); } stringBuilder.ToString().Dump(); /* output: 假设这 是一段 超长的 文本, 超过了2 048个字 节 */
👍方法3
上面的方法虽然可以解决中文字符被截断的问题,但是却无法处理emoji表情,因为emoji表情的长度有时候是4个字节,有时更长,在字符中都无法直接获取
,所以在拆分的时候,会导致emoji表情被截断。因此需要使用unicode字符来拆分,这样就可以解决中文字符和emoji表情被截断的问题。
var text = "假设这是一段超长的文本,👍超过了2048个字节"; var stringBuilder = new StringBuilder(); var limit = 10; var bytes = 0; var enumerator = StringInfo.GetTextElementEnumerator(text); while (enumerator.MoveNext()) { string unicodeCharacter = enumerator.GetTextElement(); var b = Encoding.UTF8.GetBytes(unicodeCharacter); if (bytes + b.Length >= limit) { stringBuilder.ToString().Dump(); stringBuilder.Clear(); bytes = 0; } bytes += b.Length; stringBuilder.Append(unicodeCharacter); } stringBuilder.ToString().Dump(); /* output: 假设这 是一段 超长的 文本, 👍超 过了204 8个字 节 */
分类:
编码实战
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器