• 长文本拆分


    长文本拆分

    TL;DR

    1. 企业微信消息长度限制为2048个字节,字符长度不等于字节长度
    2. 使用字节拆分,会导致中文字符被截断
    3. 使用文本+字节拆分,无法处理emoji表情
    4. 使用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个字
    */
  • 相关阅读:
    强化学习调度环境:析取图和离散事件仿真
    RHCE(三、四)NTP时间服务器、SSH远程加密登录
    json配置文件读入redis - 包含命令行解析示例
    4、StyleGAN系列
    NNDL 实验六 卷积神经网络(3)基于ResNet18的图像分类
    读取SolidWorks文档中的属性,生成PDF(工具开发)
    Taro小程序跨端开发入门实战
    C++常用的音频工具库
    运算符练习
    深入理解JVM(一) JVM是做什么的
  • 原文地址:https://www.cnblogs.com/xbotter/p/17637416.html