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

 

 

 

 

 

时间: 2024-10-25 19:00:43

XE4 for ios 谨慎处理字符串的相关文章

iOS 文件及字符串相关操作汇总 - 持续更新中......

iOS 文件及字符串相关操作汇总 - 持续更新中...... 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 1.获取应用包中文件的绝对路径: NSString *absoluteFileNam

iOS - Swift String 字符串

前言 public struct String public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding Swift 语言主要使用 String 和 Character 来存储字符数据.String 是字符串类型,Character 是字符类型,一个或多个字符组成一个字符串. String : Swift 语言中的 String 类型与经典 Cocoa 或 Cocoa Touch 框架中的 Foun

iOS - OC NSString 字符串

前言 @interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding> @interface NSMutableString : NSString 1.不可变字符串的创建 // 直接创建不可变字符串 /* 在 OC 中,使用 @"XXX" 格式定义的字符串,是保存在常量区的,只要内容相同,内存地址就一致 */ NSString *string1 = @"bei jing hua

ios-iOS怎么将字符串%u54C8%u54C8%u54C8 转成中文

问题描述 iOS怎么将字符串%u54C8%u54C8%u54C8 转成中文 %u54C8%u54C8%u54C8 中文转码为哈哈哈,但是现在我采用 NSStringEncoding GB2312_encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); return [linkstr stringByReplacingPercentEscapesUsingEncoding:GB231

Objective-C中字符串的拼接方法小结_IOS

在 java 和 c# 中,字符串的拼接是直接用 + 来操作的.在 OC 中,说是有下面3种方法, NSString* string; // 结果字符串 NSString* string1, string2; //已存在的字符串,需要将string1和string2连接起来  方法1: 复制代码 代码如下: string = [NSString initWithFormat:@"%@,%@", string1, string2 ];   方法2: 复制代码 代码如下: string =

ios-IOS SWIFT 判断字符串是否含有字母

问题描述 IOS SWIFT 判断字符串是否含有字母 iOS 如和判断字符串中是否含有字母,用swift写.网上给的没弄出来,希望小伙伴们能给个好的例子 解决方案 判断是否包含字母 let string = "输入检测字符"; for char in string.utf8 { if (char > 64 && char < 91) || (char > 96 && char < 123) { print("字符串中包含

IOS实现邮箱模糊匹配的功能_IOS

先来看看要实现的效果图 一.介绍一下功能 当输入一个邮箱的数字,会默认在后面匹配出来@qq.com,当然这个默认@qq.com可以换成其他的如@163.com等等.这里默认是@qq.com,因为我们的产品汪做过统计大多数用户还是用的qq邮箱,所以默认是@qq.com. 当输入@符号还是不会有所变化,但是如果在@之后再输入字符,会将这个字符和你想要提示的邮箱后缀做匹配,我这里是需要匹配@qq.com,@163.com,@126.com,@yahoo.com,@139.com,@henu.com类型

Swift基本语法

原文:Swift基本语法 Swift基本语法   简介 1.什么是Swift Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为"雨燕" 跟Objective-C一样,可以用于开发iOS.Mac应用程序 苹果从2010年7月开始设计Swift语言,耗时4年打造   2.Swift的语法特点 从它的语法中能看到Objective-C.JavaScript.Python等语言的影子 语法简单.代码简洁.使用方便 可与Objective-C混合使用

史上最全的Java新手问题汇总

Java是目前最流行的编程语言之一--它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在. 有超过30亿的设备是运行在Java之上的.根据Oracle的统计数据,光是使用中的Java Card就有有50亿. 超过900万程序员选择使用Java进行开发,它是最受开发人员欢迎的语言,同时也是最流行的开发平台. 本文为那些准Java程序员们准备了一系列广为流传的Java最佳编程实践 优先返回空集合而非null 如果程序要返回一个不包含任何值的集合