XE4 for ios 谨慎处理字符串

简介: 由于xe4 for ios  里面的字符串处理有变化,具体可以参考官方文档,这两天帮一个朋友调试ios 的 应用,由于没有注意这一块,折腾了很长时间。特此记录下来,希望其他人不要走弯路。 以下面代码为例:   function myDecodestr(const AString:s...

   由于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 下开发时特别要小心。

 

 

 

 

 

目录
相关文章
|
7月前
|
iOS开发
iOS中如何显示后台返回的带有html标签的富文本字符串
iOS中如何显示后台返回的带有html标签的富文本字符串
71 0
|
7月前
|
安全 Java Android开发
iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
79 0
|
7月前
|
安全 Java Android开发
iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
在网上搜“代码混淆”关键词,可以看到n多教程。包括本篇博客,大部分重要内容也是从网上各位大神的博客里面看到然后摘取和总结出来的。虽然网上都有,但是对于我个人来说,很难找到一篇博客概括完全的,所以还是总结一下,也算是学习的纪录。
|
iOS开发
iOS HTML转字符串
iOS HTML转字符串
117 0
|
iOS开发
iOS 检测字符串中数字个数、特殊符号个数
iOS 检测字符串中数字个数、特殊符号个数
180 0
|
iOS开发
iOS 检测字符串中是否含有数字、特殊符号
iOS 检测字符串中是否含有数字、特殊符号
395 0
|
iOS开发
iOS 检测字符串中是否含有字母、大写字母、小写字母
iOS 检测字符串中是否含有字母、大写字母、小写字母
338 0
|
iOS开发
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
94 0
|
程序员 API iOS开发
iOS开发:字符串设置指定内容的文字颜色、文字大小、文字字体类型
在iOS开发过程中,会有一些为了提高APP的视觉效果而设置的特别一点的效果,比如一行文字需要自定义不同的颜色和文字大小,这就用到通过富文本来设置字符串的颜色、大小和文字类型。这篇博文我打算只介绍怎么设置指定内容的一些文字属性设置,如果之前看过我写的博文,就会发现有一篇类似介绍通过富文本来设置字符串内容的博文,但是那篇是综合性的,包括介绍button的,以及UItextfield的设置,所以在这里我只介绍怎么设置字符串指定位置的一些自定义设置的方法,如有不妥之处,欢迎指正。
625 0
|
存储 文件存储 iOS开发
iOS小知识:解决部分英文国际化没有生效的问题(一个语言对应多个字符串资源文件的方案)
iOS小知识:解决部分英文国际化没有生效的问题(一个语言对应多个字符串资源文件的方案)
584 0
iOS小知识:解决部分英文国际化没有生效的问题(一个语言对应多个字符串资源文件的方案)