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 ...
随机推荐
- 7.7 GRASP原则七: 纯虚构 Pure Fabrication
GRASP原则七: 纯虚构 Pure Fabrication 如果依据信息专家原则获得的解决方案不合适,既不想违反低耦合.高内聚,也不想违 反其他的原则, 该如何把职责分配给对象? 左右为难… ...
- ajax请求本地文件
这是一个小随笔,真的很简短! 主要入坑点有两个 一.Chrome浏览器默认不支持ajax读取本地文件 解决:1.关闭所有Chrome网页 2.右击Chrome浏览器,打开“属性” 3.弹出属性 ...
- 如何破解MyEclipse 10.x
本文以MyEclipse Professional 10.6 为例来介绍如何破解MyEclipse 10.x. 本文使用的破解补丁对MyEclipse Standard/ Professional/ ...
- Java覆盖
Java的覆盖: 源代码: package dijia;class Parent1{ void f() { System.out.println("迪迦奥特曼1"); } void ...
- day72 关于rbac组件的小部分面试题
rbac的权限组件 基于角色的权限控制 1.什么是权限? url代表的就是一个权限 2.如何实现权限的控制? 表结构 以我们讲的课的内容为例 菜单表: - title 标题 - icon 图标 ...
- sticky footer
html: <div class="detail"> <div class="detail-wrapper"> <div clas ...
- Android : 跟我学Binder --- (2) AIDL分析及手动实现
目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...
- 2017年4月12日16:53:54 mysql 还有没看过的命令,spring boot rabbitmq的几种应用场景,mybaties的几种句柄及其映射规则
ON DUPLICATE KEY UPDATE rabbitmq:http://www.cnblogs.com/ityouknow/p/6120544.html http://blog.cs ...
- git不添加.idea等IDE配置文件夹
git不添加.idea等IDE配置文件夹由于.idea(intellJ,pycharm)的IDE文件夹很常出现,建议将gitignore设置为全局. git config --global core. ...
- linux command 3
#user 相关命令 #新创建一个oracle用户,这初始属于oinstall组,且同时让他也属于dba组.useradd oracle -g oinstall -G dba #删除指定用户 –r:是 ...