A:一般常用的字符串函数都是基于单字符字符串进行处理的,当遇到中文时则可能无法正常处理。
天软中中文字符为多字节字符串,一般处理这类字符串则需要使用多字节字符串支持函数。
即,一般字符串函数,暂且叫“英文字符串”处理函数,而处理带中文的字符串函数,我们叫“多字节字符串”处理函数。
这两类函数常见的区别为:
在英文字符串处理函数中,一个中文字符(如汉字)占多个字节即处理成多个字符,而在多字节函数中一个汉字处理成一个字符
注:也可能存在特殊情况,具体请参与函数说明为准。
在天软中,对应单字节与多字节常用处理模型对照如下:
英文字符串 | 多字节字符串 | 功能 | 多字节函数区别说明
|
---|
length | lengthw | 计算字符串长度 | 一个汉字占一个长度
|
LeftBStr | LeftStr | 从左侧开始取指定长度的子串 | 一个汉字占一个长度
|
RightBStr | RightStr | 从右侧开始取指定长度的子串 | 一个汉字占一个长度
|
MidBStr | MidStr | 从指定位置开始取指定长度的子串 | 一个汉字占一个长度
|
Pos | AnsiPos | 查找指定串在另一个串中的开始位置 | 一个汉字占一个长度
|
Str2Array | AnsiStr2Array | 将字符串按指定字符分割成一个数组 | 多字节中分割符支持中文字符
|
ReplaceStr | AnsiReplaceStr | 字符串的部分替换,大小写敏感 |
|
ReplaceText | AnsiReplaceText | 字符串的部分替换,大小写不敏感 |
|
另外在正则中,对于匹配串中存在中文字符的,则需要将匹配串与原串转为Unicode后进行。
一般应用举例如下:
示例01:【英文字符串函数】与【多字节字符串函数】的效果对比
s:="场景编辑【pid:666】";
echo "单字节:",length(s);
echo "多字节:",lengthw(s);
return 1;
打印效果如下:
单字节:19
多字节:13
解析:字符串s中,存在"场景编辑【】"共6个中文字符,因此单字节计算出的长度比多字节的多6个。
下面示例主要描述中文字符的处理场景。
示例02:取子串
一般可用于知道要取的串的固定位置及长度
s:="场景编辑【pid:666】";
return MidStr(s,6,3);
返回字符串:pid
示例03:查找子串的位置
一般可用于判断串中是否存在某个字符
s:="场景编辑【pid:666】";
return AnsiPos("【",s);
返回数字:5
示例04:获取指定串后的子串
一般用于获取符合某个格式的内容
s:="场景编辑【pid:666】";
p1:= AnsiPos("【",s);
p2:= AnsiPos("】",s);
return midStr(s,p1+1,p2-p1-1);
返回字符串:pid:666
示例05:将字符串按某个中文字符进行切割成数组
一般可用于格式化串进行批量解析
s:="场景编辑【pageid:P906892】场景详情【comid:P906892001】xxx";
return AnsiStr2Array(s,"】");
返回数组:
示例06:中文字符的替换
s:='和顺电气;大通退';
return AnSIReplaceStr(s,"退","T");
返回字符串:和顺电气;大通T
此时,若用return ReplaceStr(s,"退","T");则会产生乱码。
示例07:正则中匹配串含中文字符
title := "场景编辑【pageid:P906892】,场景详情【comid:P906892001】";
regDef := '【([\\w]+):([\\w]+)】';
//将匹配串与源串转成Unicode字符
title_L := multibytetounicodew(title, 936);
regDef_L := multibytetounicodew(regDef, 936);
r:=parseregexpr(regDef_L, title_L, '', m);
//此时m数组中存放的都是Unicode字符,需要转成多字节字符串
if r then
m::=UnicodeToMultiByte(mcell,936);
else return "匹配失败";
return m;
返回结果:
相关FAQ:
FAQ:
Q:天软中如何正确判断中文(汉字)字符串?
FAQ:
Q:用匹配串[^\u4e00-\u9fa5]+匹配汉字报错:unbalanced [] at offset 2