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 下开发时特别要小心。
XE4 for ios 谨慎处理字符串的更多相关文章
- iOS十六进制和字符串的相互转换
转换代码,崩溃日志有些是十六进制 NSString *dictString = [dict JSONFragment];//组合成的 dictString==={"content" ...
- iOS不可变字符串的所有操作
可以直接复制代码即可运行看看结果,方便理解 //NSString //OC字符串不能用printf输出 //但是遗憾的是OC没有一个从终端读取数据的方式,需要使用scanf读取C字符串然后转换成OC的 ...
- ios宏定义字符串
ios宏定义字符串 #define objcString(str) @""#str"" 使用效果: objcString(字符串)
- iOS:JSON格式字符串转字典,字典转JSON格式字符串
在iOS开发中,和服务器交互中,经常用到字典和JSON格式字符串相互转换. 代码如下: 1.JSON格式字符串转字典 + (NSDictionary *)dictionaryWithJsonStrin ...
- IOS中把字符串加密/IOS中怎么样MD5加密/IOS中NSString分类的实现
看完过后,你会学到: 1学习IOS开发中的分类实现, 2以及类方法的书写, 3以及字符串的MD5加密/解密. ---------------------------wolfhous---------- ...
- Delphi推出Delphi XE4支持IOS开发
Delphi 新推出 Delphi XE4 ,这是一个支持 iOS 应用开发的新版本.Delphi XE4 带来 Embarcadero 全新的 ARM 编译器 下载地址
- iOS中的字符串NSString
创建一个字符串对象: NSstring * str1 = @"hello world"; NSString * str = [[NSString alloc]initWithStr ...
- 【iOS】Swift字符串截取方法的改进
字符串截取方法是字符串处理中经常使用的基本方法.熟悉iOS的朋友都知道在基础类的NSString中有substringToIndex:,substringFromIndex:以及substringWi ...
- 微坑---微信小程序ios上时间字符串转换为时间戳时,在开发工具上和安卓手机上运行成功
给定一个时间字符串 var time="2017-02-27 16:42:53" js有三种转换为时间戳的方法:1.var timestamp = Date.parse(time ...
随机推荐
- springboot1.X 到2.X 的改变
参考:https://blog.csdn.net/tzs_1041218129/article/details/79514845
- Delphi 变体数组 Dataset Locate 查找定位
Format 函数 Delphi 支持“开参数”和动态数组,变体数组,使用时的语法类似 Delphi 中的集合:采用两个方括号把不同类型的变量括起来(这太方便了啊),也可以采用声明一个 TVarRec ...
- 浅谈实体类为什么要实现Serializable接口?
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创 ...
- centos6.8 安装python2.7 or python3.6
from:https://danieleriksson.net/2017/02/08/how-to-install-latest-python-on-centos/ 准备 # Start by mak ...
- mongodb基础学习11-复制集和分片结合使用
实际的使用中复制集和分片是结合使用的,即一个分片由一个复制集构成,多个分片存储数据库的数据 调用脚本启动两个复制集 启动configsvr的节点 启动mongos 增加分片,这次要加上复制集的id,节 ...
- Ubuntu技巧之清理系统中无用的软件包
如果你频繁的在你的系统中安装/卸载,那么不时的清理一下你的系统是十分必要的. 在Ubuntu终端中执行如下命令: sudo apt-get autoremove 屏幕输出是这个样子的: Reading ...
- 基于 tensorflow 的 mnist 数据集预测
1. tensorflow 基本使用方法 2. mnist 数据集简介与预处理 3. 聚类算法模型 4. 使用卷积神经网络进行特征生成 5. 训练网络模型生成结果 how to install ten ...
- 再识ASCII实体、符号实体和字符实体
一.前言 相信大家都熟悉通过字符实体 来实现多个连续空格的输入吧!本文打算对三类HTML实体及JS相关操作作进一步的整理和小结,若有纰漏请大家指正,谢谢. 二.初识HTML实 ...
- delphi 颜色转换函数总结
unit UColor; interface uses windows, sysutils, classes, graphics; function HexToInt(Hexa: String): L ...
- Hibernate 的事物简单的增删查改
Hibernate 是一个优秀的ORM框架体现在: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管 ...