当前位置: 首页 > news >正文

中英文按视觉长度分割

--中英文按视觉长度分割
unit TextSplitHelper;

interface

uses
System.SysUtils, System.Classes, System.Character;

type
TTextSplitHelper = class
public
// 按指定视觉长度分割中英混合文本
// 参数:
// ASourceText: 待分割的源文本
// ATargetLength: 每个片段的目标视觉长度(中文字符计2,英文计1)
// 返回: 分割后的文本片段列表
class function SplitTextByVisualLength(const ASourceText: string; ATargetLength: Integer): TStringList;
private
// 计算单个字符的视觉长度
class function GetCharVisualLength(const AChar: Char): Integer;
end;

implementation

{ TTextSplitHelper }

class function TTextSplitHelper.GetCharVisualLength(const AChar: Char): Integer;
begin
// 判断是否为中文字符(Unicode基本汉字区)
if (AChar >= #$4E00) and (AChar <= #$9FFF) then
Result := 2 // 中文字符计2个长度单位
else
Result := 1; // 其他字符计1个长度单位
end;

class function TTextSplitHelper.SplitTextByVisualLength(const ASourceText: string; ATargetLength: Integer): TStringList;
var
CurrentLength: Integer; // 当前累计长度
CurrentSegment: string; // 当前拼接的文本片段
I: Integer; // 循环变量
CharLen: Integer; // 当前字符的视觉长度
begin
Result := TStringList.Create;
try
// 边界处理:目标长度≤0或源文本为空,直接返回空列表
if (ATargetLength <= 0) or (ASourceText.IsEmpty) then
Exit;

CurrentLength := 0;
CurrentSegment := '';

// 逐字符遍历源文本
for I := 1 to Length(ASourceText) do
begin
CharLen := GetCharVisualLength(ASourceText[I]);

// 如果添加当前字符后超过目标长度,则先保存当前片段
if (CurrentLength + CharLen) > ATargetLength then
begin
if CurrentSegment <> '' then
Result.Add(CurrentSegment);

// 重置当前片段和累计长度
CurrentSegment := ASourceText[I];
CurrentLength := CharLen;
end
else
begin
// 未超过长度,继续拼接
CurrentSegment := CurrentSegment + ASourceText[I];
CurrentLength := CurrentLength + CharLen;
end;
end;

// 添加最后一个未完成的片段
if CurrentSegment <> '' then
Result.Add(CurrentSegment);
except
Result.Free;
raise;
end;
end;

end.


----------------------调用--------------------------

procedure TForm1.Button1Click(Sender: TObject);
var
SplitList: TStringList;
I: Integer;
begin
// 待分割的中英混合文本
const SourceText = 'Delphi10中文混合文本分割测试123456';
// 指定分割长度为8(视觉宽度)
SplitList := TTextSplitHelper.SplitTextByVisualLength(SourceText, 8);
try
// 输出分割结果
Memo1.Clear;
for I := 0 to SplitList.Count - 1 do
Memo1.Lines.Add(Format('片段%d: %s', [I+1, SplitList[I]]));
finally
SplitList.Free;
end;
end;

http://www.jsqmd.com/news/322699/

相关文章:

  • C# 泛型编译后究竟长啥样?
  • 目标检测数据集 - 饮用水垃圾检测数据集下载
  • 为啥“泛型”非得在编译期把类型参数定死?——大白话讲透 C# 泛型背后的规矩(含很多生活比喻)
  • 1月30号
  • 反射调用为何疯狂GC?揭秘装箱与锯齿图
  • 文件在模型服务化中的各个状态IncomingFile➡FileItem;项目异常抛出体系;环境变量url与普通常量url区别;
  • 中英文、中英标点及数字按视觉长度分割
  • 2026简单易用的PPT智能生成工具及实操指南
  • 揭秘电商企业降本60%的SQL优化黄金法则
  • 超轻量图片水印添加工具:13.5KB绿色版,支持自定义内容与位置
  • 告别熬夜做PPT!5款高性价比AI生成工具,效率翻倍不踩坑
  • 考执业医师哪个课程好?小编推荐你选阿虎医考!
  • 爆了!关于2026开年3位程序员接连猝死事件对普通人的启示录一
  • 视频批量智能分割工具:一键自动剪辑与镜头识别教程
  • 考中医执业医师,到底哪个老师讲得好?
  • 告别熬夜做PPT!3款AI一键生成神器,学生党职场人闭眼冲
  • 备课效率翻倍!2026教师专用PPT工具全攻略:传统神器+AI黑科技一网打尽
  • 告别PPT排版焦虑!4个宝藏模板平台,覆盖全场景需求
  • 告别熬夜做PPT!4款宝藏生成工具实测,小白也能秒变设计大神
  • 三维激光扫描与comsol
  • 高低温冲击试验箱哪家质量好?精选厂家对比
  • 备课神器|6款教师专属PPT生成工具,5分钟搞定精美课件!
  • 2026学生党PPT神器推荐:3款AI工具实测横评,告别熬夜赶稿!
  • 备考中医执医考试,我为什么推荐阿虎医考
  • 揭秘!6款宝藏PPT制作工具,适配所有人群,新手也能轻松上手
  • 学生党PPT神器全攻略:免费工具+AI助手,轻松搞定课堂汇报与小组作业
  • 1.29.codeforces div2 C,D 个人题解 - CUC
  • 2025-2026 AI PPT工具实测解析:百度文库PPT全场景能力拆解
  • 2026职场PPT工具天花板推荐:AI赋能+高效出稿,打工人必备指南
  • 2026年A级防火悬挂吸音板厂家权威推荐榜:工程专用/防火阻燃优质品牌全解析