fcurrk 发表于 2012-10-24 10:11:28

[已解决]怎么计算字符串的字节数

本帖最后由 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字节的

netegg 发表于 2012-10-24 10:13:58

_WinAPI_StrLen

fcurrk 发表于 2012-10-24 10:16:47

真快,感谢,我试试

3mile 发表于 2012-10-24 12:32:07

是这个意思?
$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 12:57:23

本帖最后由 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:00:27

本帖最后由 xiehuahere 于 2012-10-24 13:02 编辑

3mile的,学习了~~
BinaryLen就是用来取得字节数的,而且不用区分ASCII还是Unicode,真好!

fcurrk 发表于 2012-10-24 13:11:33

回复 4# 3mile

感谢3mile的方法,测试了最好用,开心啊。

fcurrk 发表于 2012-10-24 13:17:43

回复 5# xiehuahere


非常感谢指导,我也不会用这个

shenrenba 发表于 2012-10-25 09:28:47

本帖最后由 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

xdcysten 发表于 2013-3-18 19:31:53

谢谢3mile,BinaryLen很实用

zghwelcome 发表于 2016-5-7 23:31:45

学习了,受益匪浅
页: [1]
查看完整版本: [已解决]怎么计算字符串的字节数