zoukankan      html  css  js  c++  java
  • XE4 for ios 谨慎处理字符串

       由于xe4 for ios  里面的字符串处理有变化,具体可以参考官方文档,这两天帮一个朋友调试ios 的

    应用,由于没有注意这一块,折腾了很长时间。特此记录下来,希望其他人不要走弯路。

    以下面代码为例:

    function myDecodestr(const AString:string):string;
    const
       //                              0 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
       Hex2Dec:array[0..31] of byte = (0,10,11,12,13,14,15,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0);
    var
       i,k,l:integer;
        B: TBytes;
    begin
         l:=Length(AString);
         if l<=0 then
         begin
              Result:='';
              exit;
         end;
         setlength(b,l);
         i:=1;
         k:=0;
          repeat
                if AString[i]='+' then
                  begin
                       b[k]:=ord(' ');//  sb.Append(' ');
                       inc(i);
                       inc(k);
                  end
                  else if AString[i]='%' then
                  begin
                      b[k]:=(Hex2Dec[ord(AString[i+1]) and $1F] shl 4)
                                +Hex2Dec[ord(AString[i+2]) and $1F];
                      inc(i,3);
                      inc(k);
                  end
                  else
                  begin
                       b[k]:=ord(AString[i]);
                       inc(i);
                       inc(k);
                  end;
            until i>l;
         setlength(b,k);
    
        result:=TEncoding.utf8.GetString(b);
    
    end;
    

    这个函数的功能就是把非标准ASCII 码进行编码,在win32 下,没有任何问题。

    在ios 下,可以正常常运行,但是得到的结果不对。由于编译时也没有报错误,当时没有注意这一块,

    在ios 上运行程序老是出错,经过跟踪才发现是win32 与 ios 下字符串处理的问题。

    IOS 上,已经不能使用 s[1], 这样表示字符串第一个字符了。而且也不建议使用s[i] 取字符串中的字符。

    为了统一win32 与 IOS 下的代码(呵呵,也为后半年的android 做准备),以上代码使用XE4 的stringhelper进行

    修改。

    最后代码为:

    function myDecodestr(const AString:string):string;
    const
       //                              0 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
       Hex2Dec:array[0..31] of byte = (0,10,11,12,13,14,15,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0);
    var
       i,k,l:integer;
        B: TBytes;
        c:char;
    begin
         l:=Length(AString);
         if l<=0 then
         begin
              Result:='';
              exit;
         end;
         setlength(b,l);
         i:=0;
         k:=0;
         c:= AString.Chars[i];
          repeat
                if AString.Chars[i]='+' then
                  begin
                       b[k]:=ord(' ');//  sb.Append(' ');
                       inc(i);
                       inc(k);
                  end
                  else if AString.Chars[i]='%' then
                  begin
                      b[k]:=(Hex2Dec[ord(AString.Chars[i+1]) and $1F] shl 4)
                                +Hex2Dec[ord(AString.Chars[i+2]) and $1F];
                      inc(i,3);
                      inc(k);
                  end
                  else
                  begin
                       b[k]:=ord(AString.Chars[i]);
                       inc(i);
                       inc(k);
                  end;
            until i>l;
         setlength(b,k);
    
        result:=TEncoding.utf8.GetString(b);
    
    end;
    

     注意,AString.Chars[i]  里面,第一个字符的i 为0,这与传统win32 的s[1] 为第一个字符不一样。

    在ios 下开发时特别要小心。

  • 相关阅读:
    零知识证明,中间人攻击,盲签名:原理和应用——三篇密码学科普文章
    json
    优化自己的编写出来的C#程序
    C++中不同的继承方式
    C语言程序编写涉及内存的问题
    面向Android的Tesseract工具
    常见Linux使用的十大问题
    Java语言链接数据库连接池配置的两种技巧
    配置数据库连接池的技巧
    PHP和Java在Web开发下相比较
  • 原文地址:https://www.cnblogs.com/xalion/p/3251195.html
Copyright © 2011-2022 走看看