長文本拆分
長文本拆分
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個字
節
*/

浙公網安備 33010602011771號