[已解决]怎么计算字符串的字节数
本帖最后由 fcurrk 于 2012-10-24 13:36 编辑$var = "AutoIt 中文论坛"
MsgBox(64, "文本长度", "是:" & ChrLenFixed($var))
Func ChrLenFixed($c)
Dim $ChrL = 0, $AscNum
For $i = 1 To StringLen($c)
$AscNum = AscW(StringMid($c, $i, 1))
If $AscNum < 0 Then $AscNum = $AscNum + 65536
If $AscNum > 255 Then
$ChrL = $ChrL + 2
Else
$ChrL = $ChrL + 1
EndIf
Next
Return $ChrL
EndFunc用了老毛桃的这个方法,但有很多特殊的符号不能准确识别,请教个完美的方法。
如 ·等字符。
在AU3下为一字节,但显示的时候是占用了2字节的 _WinAPI_StrLen 真快,感谢,我试试 是这个意思?
$var = "·"
MsgBox(64, "文本长度", "是:" & ChrLenFixed($var))
MsgBox(64, "文本长度", "是:" & len($var))
Func ChrLenFixed($c)
Dim $ChrL = 0, $AscNum
For $i = 1 To StringLen($c)
$AscNum = AscW(StringMid($c, $i, 1))
If $AscNum < 0 Then $AscNum = $AscNum + 65536
If $AscNum > 255 Then
$ChrL = $ChrL + 2
Else
$ChrL = $ChrL + 1
EndIf
Next
Return $ChrL
EndFunc
Func len($c)
Return BinaryLen(StringToBinary($c))
EndFunc 本帖最后由 xiehuahere 于 2012-10-24 13:13 编辑
回复 1# fcurrk
AscW函数的帮助里的例子说了:
MsgBox(32,"注意","其实这个函数还是有缺陷,UNICODE是两个字节来表示一个字符的,但是西欧字符在AUTOIT中还是使用一个字节.")
_WinAPI_StrLen一开始不会用,琢磨了下会了:
#Include <WinAPIEx.au3>
Local $a = DllStructCreate("char var")
DllStructSetData($a, 1, "·")
MsgBox(0, "文本长度", _WinAPI_StrLen(DllStructGetPtr($a), FALSE))
$a = 0
但貌似不是用来计算字节数的,
测试了“你好”,_WinAPI_StrLen(DllStructGetPtr($a), True) 返回2,不对。 本帖最后由 xiehuahere 于 2012-10-24 13:02 编辑
3mile的,学习了~~
BinaryLen就是用来取得字节数的,而且不用区分ASCII还是Unicode,真好! 回复 4# 3mile
感谢3mile的方法,测试了最好用,开心啊。 回复 5# xiehuahere
非常感谢指导,我也不会用这个 本帖最后由 shenrenba 于 2012-10-25 09:33 编辑
还是3m的代码好虽然结果一直
$var = "·"
MsgBox(64, "文本长度", "是:" & ChrLenFixed($var))
Func ChrLenFixed($c)
Dim $ChrL = 0, $AscNum
For $i = 1 To StringLen($c)
$AscNum = StringMid($c, $i, 1)
If $AscNum = Chr(AscW($AscNum)) Then
$ChrL += 1
Else
$ChrL += 2
EndIf
Next
Return $ChrL
EndFunc ;==>ChrLenFixed 谢谢3mile,BinaryLen很实用 学习了,受益匪浅
页:
[1]