Delphi 7升级到XE2的字符串问题
原来的Delphi中有两种字符串:AnsiString和WideString。默认的string即AnsiString。而在Delphi 2009中,新增加了一种UnicodeString。为什么不沿用之前的WideString呢?WideString其实是为了方便使用COM而产生的,就是BSTR。BSTR没有引用计数,效率较低。而UnicodeString才是AnsiString的真正unicode版本。于是,Delphi 2009就有了三种字符串类型:AnsiString、WideString、UnicodeString。默认的string即为UnicodeString。对应的相关类型包括:
AnsiString - PAnsiChar - TAnsiString?(这个可以有……这个真没有,JclAnsiStrings.pas是一个替代品)
WideString - PWideChar - TWideStrings(WideStrings.pas)
UnicodeString - PWideChar - TStrings(Classes.pas)
在实际应用中,一般应使用UnicodeString。在效率第一的场合,可以使用AnsiString处理Ansi文本。而WideString仅在使用COM的时候才需要,或者是为了向下兼容。
几个字符串相关unit的作用
StrUtils.pas :UnicodeString的处理函数。
AnsiStrings.pas :AnsiString的处理函数。
WideStrUtils.pas :WideString的处理函数。
WideStrings.pas :TWideStringList的实现。
Classes.pas :TStringList的实现。
JclAnsiStrings.pas:TJclAnsiStringList的实现。这个虽然是第三方库,但不得不提,谁让CodeGear好死赖活不肯加呢。
Delphi 2009的VCL完全使用UnicodeString,彻底支持Unicode。TNT Unicode Controls终于完成了光辉的历史使命。VCL设计之初不支持Unicode情有可原,但多年以后,在国际化的大潮中,依然没有改变,就是重大失误了。13年的等待,黄花菜都凉了。不论如何,今日的Delphier,可以放心大胆的使用Unicode了。
关于UTF8String。UTF8String在之前的版本中就是AnsiString,没有什么特殊功能。而在Delphi 2009中,UTF8String才是真正的UTF8。如果把一个AnsiString赋值给一个UTF8String,那么Delphi 2009会自动转换格式为UTF8String,这比以前可要方便多了。
关于RawByteString。这个在某些场合有用。如果你有一个函数,接受AnsiString或者UTF8String,但不希望发生自动转换,那么可以通过重载,实现两个函数分别处理AnsiString和UTR8String。另一个选择就是使用RawByteString,那么不管传过来的是AnsiString还是UTF8String,RawByteString都会忠实的保持原样,不会做任何转换。
Delphi 7升级到XE2的字符串问题的更多相关文章
- 从Delphi 7升级到Delphi XE
Delphi 7和XE中间有好几个版本号,可都不太流行,一是由于Delphi有些边缘化,二是7在XP环境下是近乎完美的版本号.市场上关于delphi的书越来越少,提供从7升级到XE介绍的资料差点儿没用 ...
- delphi 浮点数float转换成十六进制字符串的方法(FloatToHex)
重新书写了float型转为十六进制的delphi程序 Function FloatToHex(Value: single): string; var l, i: integer; HexText,te ...
- DELPHI读取网页源文件和获取字符串
说到网页采集,通常大家以为到网上偷数据,然后把到收集到的数据挂到自己网上去.其实也可以将采集到的数据做为公司的参考,或把收集的数据跟自己公司的业务做对比等.目前网页采集多为3P代码为多(3P即ASP. ...
- Delphi窗体间发送消息或字符串
在Delphi 开发中,常常应用到窗体消息传递,以达成某种操作要求,以下列举一个应用的例子,供大家参考. 自定义过程/函数方法://发送字符串到指字句柄的窗口中 (接收窗体需用发送时的消息常量WM_C ...
- Delphi 实现16进制转字符串及字符串(中文)转16进制
//-----------------------------------------------//16进制字符转整数,16进制字符与字符串转换中间函数//--------------------- ...
- Delphi 7 升级到 Delphi 2010 总结
1 字符串 >>string =unicodeString 字母的处理要定义AnsiString了 >>PChar =PWidechar >>str='普通汉字' ...
- delphi中Bitmap位图与base64字符串相互转换
uses EncdDecd; ///将Bitmap位图转化为base64字符串 function BitmapToString(img:TBitmap):string ; var ms:TMemory ...
- Delphi 用文件流读取文本文件字符串的方法
procedure TForm23.Button4Click(Sender: TObject); var pstr:Pchar; mestr,Str1:string; FS:TFilestream; ...
- delphi 截取指定符号之间的字符串-随机读取
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Syste ...
随机推荐
- Access查询时间段 .
access数据库cmd // SendTime是在Access数据库中是文本类型 StringBuilder sb = new StringBuilder(); sb.Append("SE ...
- 小程序组件 scroll-view 滑动
小程序组件 scroll-view 中分别有上下竖向滑动和左右横向滑动之分,在这次项目中刚好需要用到横向滑动,但在测试过程中发现横向滑动没有了效果(静止在那里没移动过),经调试发现: 1.scroll ...
- js中提示框闪退问题
当页面存在刷新 或 在线引用iframe框架时(引用框架也会导致刷新) 会导致页面加载时的弹出框闪退 解决方法:设置弹出框在页面或者框架完全加载一段时间后再弹出 <script type=& ...
- 一个二维码如何自动识别是安卓(Android)还是苹果(IOS)
思考问题: 通常,我们开发一个APP,有Android版本.IOS版本. 但是只有一个二维码?怎么办呢? 怎么让IOS用户扫描二维码下载IOS版本,Android用户扫描二维码下载到Android版本 ...
- 【转】 SQL - 生成指定范围内的随机数
DECLARE @Result INT DECLARE @Upper INT DECLARE @Lower INT SET @Lower = 1 SET @Upper = 10 SELECT @Res ...
- 如何 distinct 只对一个字段有用,同时查出其他字段
转至:http://blog.csdn.net/u013402772/article/details/51262524 在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有d ...
- 微信小程序silk格式转码成mp3格式
最近小程序项目需要录制语音并上传到服务器,经过查资料了解 目前微信小程序录音的文件后缀名是silk,因此需要转换. 经过查资料了解,参考一下的地址 https://github.com/kn007/s ...
- .Netcore使用Session
1.使用Session(进程内) 在startup中添加方法 services.AddSession app.UseSession() services.AddDistributedMemoryCa ...
- Charles设置HTTPS抓包
1. 配置 Charles 根证书 点击 Help -> SSL Proxying -> Install Charles Root Certificate 之后会弹出钥匙串,如果不弹出,请 ...
- Python简介(一)
1.Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...