找回密码
 加入
搜索
查看: 4361|回复: 10

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

  [复制链接]
发表于 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字节的
发表于 2012-10-24 10:13:58 | 显示全部楼层
_WinAPI_StrLen
 楼主| 发表于 2012-10-24 10:16:47 | 显示全部楼层
真快,感谢,我试试
发表于 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
发表于 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[128]")
DllStructSetData($a, 1, "·")
MsgBox(0, "文本长度", _WinAPI_StrLen(DllStructGetPtr($a), FALSE))
$a = 0

但貌似不是用来计算字节数的,
测试了“你好”,_WinAPI_StrLen(DllStructGetPtr($a), True) 返回2,不对。
发表于 2012-10-24 13:00:27 | 显示全部楼层
本帖最后由 xiehuahere 于 2012-10-24 13:02 编辑

3mile的,学习了~~
BinaryLen就是用来取得字节数的,而且不用区分ASCII还是Unicode,真好!
 楼主| 发表于 2012-10-24 13:11:33 | 显示全部楼层
回复 4# 3mile

感谢3mile的方法,测试了最好用,开心啊。
 楼主| 发表于 2012-10-24 13:17:43 | 显示全部楼层
回复 5# xiehuahere


非常感谢指导,我也不会用这个
发表于 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
发表于 2013-3-18 19:31:53 | 显示全部楼层
谢谢3mile,BinaryLen很实用
发表于 2016-5-7 23:31:45 | 显示全部楼层
学习了,受益匪浅
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-24 08:19 , Processed in 0.105408 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表