如何取得字符串的字节长度?

sh_shj 2007-07-11 01:15:16
字符串中含单字节和双字节字符,如何取得其字节长度?
...全文
1277 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
HapCn 2007-07-14
  • 打赏
  • 举报
回复
Function StrLength(txt) '计算字符串长度,英文字母为1,汉字为2
dim x,y,ii
txt=trim(txt)
x = len(txt)
y = 0
for ii = 1 to x
if asc(mid(txt,ii,1)) < 0 or asc(mid(txt,ii,1)) >255 then '如果是汉字
y = y + 2
else
y = y + 1
end if
next
StrLength = y
End Function
jiaxueq 2007-07-14
  • 打赏
  • 举报
回复
用 jinjuduo() 就满足了。
smartcatiboy 2007-07-13
  • 打赏
  • 举报
回复
VBS和JS使用unicode,任何字符都是双字节。

”含单字节和双字节字符“一说,只对储存和传输中的编码成立。
sh_shj 2007-07-13
  • 打赏
  • 举报
回复
上面的函数改了一下,消除了BUG:

function bytelen(HTMLS) '计算字符串的字节长度
Dim regEx ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = "[^\x00-\xff]" ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分字符大小写。
regEx.Global = True ' 设置全局可用性。
bytelen = len(regEx.Replace(HTMLS,"xx")) ' 执行搜索替换得到字节长度。
end Function

function byteleft(str,length) '按字节长度左截字符串
Dim regEx,tmpch,curlen,i ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = "[^\x00-\xff]" ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分字符大小写。
regEx.Global = True ' 设置全局可用性。
if bytelen(str)>length then
byteleft=""
curlen=0
i=0
while curlen<length
i=i+1
tmpch=mid(str,i,1)
byteleft=byteleft+tmpch
curlen=curlen+len(regEx.Replace(tmpch,"xx"))
wend
else
byteleft=str
end if
end Function
sh_shj 2007-07-12
  • 打赏
  • 举报
回复
自己写了个函数解决了:

function byteleft(str,length) '按字节长度左截字符串
Dim regEx,tmpch,curlen,i ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = "[^\x00-\xff]" ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分字符大小写。
regEx.Global = True ' 设置全局可用性。
curlen=0
i=0
while curlen<length
i=i+1
tmpch=mid(str,i,1)
byteleft=byteleft+tmpch
curlen=curlen+len(regEx.Replace(tmpch,"xx"))
wend
end Function
sh_shj 2007-07-12
  • 打赏
  • 举报
回复
谢谢大家!现在又有新问题了:
取得字节长度后用LEFT()截取的字符串不是按字节长度截取的,请问这又如何解决呢?
jinjuduo 2007-07-12
  • 打赏
  • 举报
回复
其实这里还是用javascript比较简单,
这里的asp代码的原理和上面的
<script type="text/javascript">
var s='中文,English';
alert("["+s+"]的长度:"+s.replace(/[^\x00-\xff]/gi,'xx').length)
</script>原理是相同的,都是正则表达式替换
regEx.Pattern = "[^\x00-\xff]" ' 设置模式。取文档中的所有双字节字符。
之后把所有双字节字符,替换成两个英文字符。
字後用len函数取长度。
如果你还有不懂的地方,建议你看看正则表达式。

还有7楼的方法也可以,网上有很多这样的vbscript函数,取字节来计算长度。
snlixing 2007-07-12
  • 打赏
  • 举报
回复
<script language="javascript">
function strlen(str)
...{ var len; var i; len = 0;
for (i=0;i<str.length;i++)
...{ if (str.charCodeAt(i)>255) len+=2; else len++; }
alert("长度为:"+len); }

strlen("china中国");
</script>

在这个javascript脚本中,strlen函数逐个取str字符串中的Unicode字符,利用charCodeAt获取指定位置的字符的值(为数字形式,可和数字进行比较),因为英文字符的值总在0到255之间,所以我们可以认定,如果该值大于255,就表示是汉字,长度加2,否则长度加1,这样最终可得到这个字符串以字节计的长度,满足了我们的要求。
sh_shj 2007-07-12
  • 打赏
  • 举报
回复
谢谢 jinjuduo() 提供代码!
可是不知道是什么原理,能解释一下吗?
kookies 2007-07-12
  • 打赏
  • 举报
回复
上面的程序有个bug,如果取的长度大于字符串本身长度就显示不了
kookies 2007-07-12
  • 打赏
  • 举报
回复
弱弱的问下楼主怎么调用你写的那个函数啊?
iamXiaMi 2007-07-12
  • 打赏
  • 举报
回复
LenB(Str)
就可以了

<html>
<body>
<script language="vbscript">
Dim text
text = "字符串123"
MsgBox Len(text)
MsgBox LenB(text)
</script>
</body>
</html>

单得到的是12,因为NT系统都同意用的UNICODE编码...用9X系统估计就能得到9了~
godgreat 2007-07-12
  • 打赏
  • 举报
回复
接分
jinjuduo 2007-07-11
  • 打赏
  • 举报
回复
<script language="vbScript" >
function clear(HTMLS)
Dim regEx ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = "[^\x00-\xff]" ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分字符大小写。
regEx.Global = True ' 设置全局可用性。
clear= regEx.Replace(HTMLS,"xx") ' 执行搜索。
end Function
msgbox (Len(clear("zhongwen中文")))
</script>
sh_shj 2007-07-11
  • 打赏
  • 举报
回复
用VBS能实现吗?
jinjuduo 2007-07-11
  • 打赏
  • 举报
回复
<script type="text/javascript">
var s='中文,English';
alert("["+s+"]的长度:"+s.replace(/[^\x00-\xff]/gi,'xx').length)
</script>
sh_shj 2007-07-11
  • 打赏
  • 举报
回复
用len('字符串123'),得到的长度是6,而不是9。
mataofq 2007-07-11
  • 打赏
  • 举报
回复
obj.length();
zhangjingcheng 2007-07-11
  • 打赏
  • 举报
回复
用len不可以?

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧