简述len、lenw、right、Rightw、left、leftw、pos、LastPos结合使用之坑

        今天在研究zip压缩时,压缩完文件之后,需要获取文件的名字以供在窗口显示其信息,结果出现获取的文件名称前面多出一些字符(本来应该是:新建文本文档.txt,结果却是:虢庋顾?新建文本文档.txt),如下图示

简述len、lenw、right、Rightw、left、leftw、pos、LastPos结合使用之坑

 正确结果应该是:

简述len、lenw、right、Rightw、left、leftw、pos、LastPos结合使用之坑

原先获取字符串的子串时,都是用的是pos()+mid()+len()的方式,没有出现过这种问题,而这次使用的是lastpos()+len()+right(),却出现了子串错误的情况。

        经过查阅文档和demo测试,发现len、lenw、right、Rightw、left、leftw、pos、LastPos这几个方法在使用上存在一个坑,那就是方法返回的值或形参中的个数(例right方法中的第二个参数)到底是按字节的,还是按字符来计算。如果将按字节计算的方法与按字符计算的方法结合使用,自然而然就出现了前面提到的错误问题。

        那究竟哪些是按字节、哪些是按字符计算的呢?

        经过验证,在上述方法中,pos、mid、len是按字节计算,而lastpos、Rightw、leftw的第二个形参则是按字符计算的,最诡异的是right和left两个方法,开发文档对其第二个形参的描述是这样:A long whose value is the number of characters you want returned from the right end of string,其意思就是“从字符串右端返回的字符数”,也就是说是按字符计算的,但是与len和lenw结合使用,你会发现,right、left方法在与len方法一起使用的时候,是按字字符计算,但是与lenw方法一起使用的时候又是按字节来计算。

例如:

        有如下字符:

       string ls_path='C:\Desktop\新建文本文档.txt'

       int li_next = LastPos(ls_path, "\")    //获取ls_path最后一个"\"的个数位置,LastPos按字符计算

       当在Right方法中使用Len时:

                Right(ls_path,(Len(lls_path) - li_next)) ,获取到的值是:虢庋顾?新建文本文档.txt

       而使用lenw时:

                Right(ls_path,(LenW(lls_path) - li_next)),获取到的值是:本文档.txt

        而当Right的第二个形参写死时:

                Right(ls_path,10),获取到的值是:本文档.txt(说好的按字符计算呢?怎么按字节计算了)

        当在RightW方法中使用len时:

                RightW(ls_path,(Len(lls_path) - li_next)),获取到的值是:p\新建文本文档.txt

                在窗口则显示:乱码+新建文本文档.txt

                简述len、lenw、right、Rightw、left、leftw、pos、LastPos结合使用之坑

        而使用lenw时:

                RightW(ls_path,(LenW(lls_path) - li_next)),获取到的值是:新建文本文档.txt

                窗口也显示正常

        而当RightW的第二个形参写死时:

                RightW(ls_path,10),获取到的值是:新建文本文档.txt

        窗口也显示正常

left与leftW也是如此,

        由此可见right和left方法是多么的坑,所以建议读者朋友在选取以上方法组合使用时请慎重。

上一篇:antd表单-单页面多表单提交功能


下一篇:Linux篇(3)——常用命令ls