演示程序中主要是用了 IsDBCSLeadByte 这个 API 来判断某字节是否在双字节字符集(例如汉字)的前导字节集中(GB 2312-80 汉字编码中的第一个字节范围 0xA1-0xFe)

procedure TForm1.Button1Click(Sender: TObject);

var

CutLengthOfLine{ 被处理字符串的总长度 }, i, j: integer;

sLine{ 被处理的源字符串 }: string;

sCuted{ 按固定长度分割出来的部分字符串 }: string;

iCutLength{ 按固定长度分割出来的部分字符串的长度 }: integer;

bIsDBCS{ 是否是汉字的前半字节 }: boolean;

begin

if edit1.text='' then begin

exit;

end;

CutLengthOfLine:=strtoint(edit1.text);

if CutLengthOfLine < 2 then begin

showmessage('CutLengthOfLine 必须大于等于 2 !');

Exit;

end;

Memo2.Lines.Clear;

for i := 0 to Memo1.Lines.Count - 1 do

begin

sLine := Memo1.Lines[i];

if Length(sLine) = 0 then

Memo2.Lines.Add(#13+#10)

else

repeat //开始处理字符串

iCutLength := CutLengthOfLine;

sCuted := Copy(sLine, 1, iCutLength);//从头取出 iCutLength 长的字符串

bIsDBCS := False;//先假设没有半个字符串

for j := 1 to iCutLength do //从头到尾逐个检查,至于为什么?

//原作者是这样解释的

//1. 为什麽不直接抓最後一个字元判断? 因为中文字的 Trail-byte, 其内码也可能落在 Lead-byte

//   的内码区间内.

//2. 为什麽不直接抓最後两个字元来判断? 因为前一个字的 Trail-byte 加上後一个字的 Lead-byte,

//   可能又是一个中文字.

begin

if bIsDBCS then  //如果上一个字节是汉字的前半部分

bIsDBCS := False //则此时本字节是汉字的后半部分,

//所以将是否前半个汉字检测标志设为假

else

if Windows.IsDBCSLeadByte(byte(sCuted[j])) then

bIsDBCS := True;//否则检查本字节,并根据结果设置标志

end;  //end of for

//如果最后一个字节的上一个字节是汉字的前半部分,则结束时

//检测标志为假,

if bIsDBCS then Dec(iCutLength);

//如果最后一个字节是汉字的前半部分, 则少截取一个字符,避免乱码

Memo2.Lines.Add(Copy(sLine, 1, iCutLength));

sLine := Copy(sLine, iCutLength + 1, Length(sLine) - iCutLength);

//拷贝出下一部分固定长度的字符串,循环处理

until Length(sLine) <= 0;

end;

memo2.setfocus;

memo2.selstart:=0;

memo2.SelLength:=0;

end;

解决Delphi截取字符串时遇到半个汉字相关推荐

  1. 截取字符串时,截取完整的表情符

    截取字符串时,有时候字符串会包含Emoji表情.以及一些特殊符号,用String的substring()进行截取操作,结果就有可能是乱码.这是因为JVM运行时使用UTF-16编码,对于普通的字符都是使 ...

  2. Java中文字符串截取,不能返回半个汉字

    转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/62215914,建议读者阅读原文,确保获得完整的信息 1. ...

  3. 带有汉字的字符串截断出现半个“汉字”的解决方法-C语言源码

    汉字字符的编码为双字节,对于汉字字符和单字节字符混排的情况,如果目标截取的字符串内只包含奇数个单字节字符,则会出现半个汉字字符的问题.如下所示: (1)天水市秦州区南郭路2号(工行七里墩分理处? -- ...

  4. 截取字符串时的全半角问题

    前两天在开发中遇到了截取字符串的问题,使用C#中的SubString时,不论汉字还是字母,全角还是半角,都当做一个字符处理,无法适应页中显示的要求,于是自己写了个StringSub,截取时全角字符计为 ...

  5. Delphi - 使用字符串时,一个注意地方

    技术交流,DH讲解. 一句话,结构体里面,避免使用String,要使用Array[N..M] of char,或者String[N]. 肯定有兄弟要问,为什么,其实最先我也不知道,因为我觉得用stri ...

  6. 用jstl截取字符串

    2019独角兽企业重金招聘Python工程师标准>>> 用jstl截取字符串 jstl以前在jsp页面截取字符串时都是用Java表达式,感觉在jsp页面用多了Java表达式不是很好( ...

  7. php代码getsubstr,ThinkPHP 模板substr的截取字符串函数实例讲解

    ThinkPHP 模板substr的截取字符串函数详解 ThinkPHP 模板substr的截取字符串函数 在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ ...

  8. php字符串分割tp模板,ThinkPHP 模板substr的截取字符串函数详解

    ThinkPHP 模板substr的截取字符串函数 在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $star ...

  9. sql截去最后一位_SqlServer从左边 最后 中间截取字符串

    SqlServer从左边 最后 中间截取字符串(摘录)2009-06-01 15:04 已知: 字段A='F:\photo\Winter Leaves.jpg' 要求:分段截取每段字符[字段A不能为T ...

最新文章

  1. 云计算将成为金融服务业的主流技术
  2. 这两天发现一个老外用JavaScript编写的好东西:dp.SyntaxHighlighter。
  3. rpm包安装mysql5.5
  4. Kettle使用_22 维度更新 缓慢变化维 拉链表
  5. 计算机网断IP修改,修改计算机名、IP
  6. linux脚本编程(shell)浅介 (转载)
  7. DEBUG主要命令(转)
  8. 【C#夯实】我与接口二三事:IEnumerable、IQueryable 与 LINQ
  9. SLIC算法分割超像素原理及Python、C++
  10. AMPL Matlab 自动求导(AD)求解雅克比、海森矩阵
  11. 123f是什么c语言,123RF博客
  12. 【原创】Structure from Motion (SfM)算法测试---3D重建简介
  13. Human Muscles/Musculature (人体肌肉组织)
  14. Vue日历的编写,可显示周和月的模式(其中可以自定义日历里内容的显示)
  15. 2017第十九届中国国际地面材料及铺装技术展览会会刊(参展商名录)
  16. 五万字 | Hive知识体系保姆级教程
  17. 【音频解码芯片】VS1503音频解码芯片的应用
  18. linux 命令运行kodi,在Ubuntu/Debian/Raspbian中安装Kodi for Linux的方法
  19. egret 白鹭笔记(2020)简单笔记
  20. html渐变编织背景,css3编写浏览器背景渐变背景色

热门文章

  1. MySQL Workbench (GUI Tool) 工具
  2. 物联网市场迎来大变局 BAT携手布局MQTT协议意欲何为?
  3. 《投名状》是数年来最成功的商业大片
  4. 数学——埃氏筛与线性筛
  5. simditor上传图片php,Simditor图片上传
  6. 搭建一个https二级代理(完整可用版)
  7. 【2017 数据技术嘉年华】9月16日成都站盛大举办!
  8. 移动web双指放大问题,vue滑动被禁止的问题
  9. Sort_排序代码集合汇总
  10. java神秘岛_Minecraft1.4.2MOD整合版