DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xieqiongxi1
今日帖子: 0
在线用户: 6
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 songcheng628 (武大郎) ★☆☆☆☆ -
普通会员
2011/4/11 15:45:59
标题:
【新人求教】Delphi中ansistring是否为ansichar组成的字符串? 浏览:3268
加入我的收藏
楼主: 好像不是这么回事呀,请看下面例子:
----------
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Dialogs ;

var
  A: string;

procedure ShowVariant(S: string);
var
  V: Variant;
begin
  V := S;
  ShowMessage(V);
  Readln;
end;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  A := '腾飞中国!';
  ShowVariant(A);
end.

----------
变量A定义为:string类型,在Delphi7里等同于AnsiString类型。
如果AnsiString为AnsiChar组成的话,中文是无法正常显示的吧?例子如下:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Dialogs ;

var
  S: AnsiChar;

begin
  S := '腾';
  Writeln(SizeOf(S));
  Writeln(S);
  Readln;
end.

结果显示无法编译。编译器似乎认为“腾”为字符串。S改为WideChar也不行,真是奇怪了。汉字不是双字节字符吗?widechar正好是为双字节unicode字符设计的。大家知道为什么吗?
----------------------------------------------
Delphi Crazy Fans! 
I am a newbie of Delphi.
作者:
男 wzwcn (wzw) ★☆☆☆☆ -
普通会员
2011/4/11 16:10:14
1楼: AnsiString是AnsiChar组成的是没错,汉字有两个字节组成的也是没错,但你的第二个例子把一个汉字(2个字节),赋给一个AnsiChar(1个字节)当然编译不过
----------------------------------------------
-
作者:
男 songcheng628 (武大郎) ★☆☆☆☆ -
普通会员
2011/4/11 16:13:26
2楼: 楼上的兄弟,你把这个代码粘贴到Delphi中,仅吧S改为WideChar也不行:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Dialogs ;

var
  S: WideChar;

begin
  S := '腾';
  Writeln(SizeOf(S));
  Writeln(S);
  Readln;
end.

编译报错。难道是我Delphi 7的问题?
----------------------------------------------
Delphi Crazy Fans! 
I am a newbie of Delphi.
作者:
男 wzwcn (wzw) ★☆☆☆☆ -
普通会员
2011/4/11 16:17:28
2楼: WideChar可以这样试:
var w:WideChar;
    s:WideString;
begin
  s:='腾';
  w:=s[1];
  self.Caption:=w;
end;

delphi把'腾'当字符串了
----------------------------------------------
-
作者:
男 songcheng628 (武大郎) ★☆☆☆☆ -
普通会员
2011/4/11 21:21:19
3楼: 有点说不通啊,过去我们学习都是说汉字占两个字符的空间,widechar不正为汉字这类文字所生妈?
----------------------------------------------
Delphi Crazy Fans! 
I am a newbie of Delphi.
作者:
男 adamwu (AdamWu) ★☆☆☆☆ -
普通会员
2011/4/11 23:16:37
4楼: WideChar是给Unicode字符使用的,占两个字节纯属巧合。
就像螺丝刀和水果刀刚好一样长,但是你不能用螺丝刀去学水果。
----------------------------------------------
-
作者:
男 songcheng628 (武大郎) ★☆☆☆☆ -
普通会员
2011/4/11 23:29:34
5楼: 汉字就属于unicode字符吧?请看:
1 Unicode编码表  
 Unicode只有一个字符集,中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分  
...
----------------------------------------------
Delphi Crazy Fans! 
I am a newbie of Delphi.
作者:
男 egust (欢迎访问 Delphi@smth.org) ★☆☆☆☆ -
普通会员
2011/4/12 0:28:49
6楼: d7 太古老了,没法正确处理 ascii 以外的 unicode 字符,换 xe 就完全没问题了
另,你贴的那段东西也太古老了,GB18030 定义的四字节区扩充B的42711汉字(如“𠀀”)对应 unicode 字符集 U+020000~U+02A6D6,像 windows 使用的 utf-16 会表示成 [0xD840,0xDC00]~[0xD869,0xDED6]。
----------------------------------------------
cnblogs中我写的关于Delphi的blog,欢迎访问:
http://www.cnblogs.com/egust/
作者:
男 linzhenqun (colin_you) ★☆☆☆☆ -
普通会员
2011/4/12 9:38:57
7楼: 有条件还是用用XE吧,毕竟D7实在太老了。
----------------------------------------------
-colin and yoyo
http://blog.csdn.net/linzhengqun
作者:
男 songcheng628 (武大郎) ★☆☆☆☆ -
普通会员
2011/4/12 20:46:59
8楼: 我感觉各位还是没有完全的回答我的问题。
----------------------------------------------
Delphi Crazy Fans! 
I am a newbie of Delphi.
作者:
男 adamwu (AdamWu) ★☆☆☆☆ -
普通会员
2011/4/13 0:57:00
9楼: 久远的历史问题,几句话回答不了。

看懂下面这个就明白了。
http://baike.baidu.com/view/684997.htm
----------------------------------------------
-
作者:
男 gregma (gregma) ★☆☆☆☆ -
普通会员
2011/4/14 8:39:56
10楼: 有点说不通啊,过去我们学习都是说汉字占两个字符的空间,widechar不正为汉字这类文字所生妈?
==========

即使汉字正好是2个字节,也不见得被编译器认为是unicode,
var 
  wchar: widechar;
begin
  wchar := 'ab'; //delphi7里面 'ab'是2个字节
end;

照样编译不过的。要想让 wchar := 'xxx' 编译成功,必须让编译器认为'xxx'是unicode。
'腾'和'ab'都是2个字节,但是编译器都认为是2个字节的字符串。

c/c++是通过L通知编译器wchar的,
char  a1 = 'a';      //普通的字符,就是ansichar
wchar_t a2 = L'a'; //有了L,'a'就是unicode
----------------------------------------------
-
作者:
男 songcheng628 (武大郎) ★☆☆☆☆ -
普通会员
2011/4/14 11:00:47
11楼: 谢谢adamwu和gregma!
终于明白了原因,我过去只简单的认为占用2个字节的是Unicode,还在想为啥Delphi2010还实现unicode,不是就有WideChar类型吗?原来是这个原因。
顺便说一句,Delphi 7中的Unicode是不是指除了英文意外的欧洲文字?如法语?亚洲语言特别是东亚三国(中、日、韩)应该是不在Delphi 7界定的unicode之列吧。
----------------------------------------------
Delphi Crazy Fans! 
I am a newbie of Delphi.
作者:
男 gregma (gregma) ★☆☆☆☆ -
普通会员
2011/4/14 13:14:30
12楼: unicode是包括了所有语言的,亚洲,欧洲的都在里面。英语,法语,中文都是的

delphi 7的问题是,这个版本的编译器对unicode的字符串常量支持不好
它不能知道字符串常量 'a中国' 是3个字符。

delphi 2009以后就没这个问题了。(这个是需要编译器支持的,对特定编码(utf8,ansi-C, utf16)的pas源代码中的字符进行分析和判断)

当然,一旦你把unicode字符常量放到unicode类型的string里面去,delphi7和delphi最新的版本一样可以work的很好。
----------------------------------------------
-
作者:
男 songcheng628 (武大郎) ★☆☆☆☆ -
普通会员
2011/4/14 14:29:52
13楼: 明白了,谢谢!
----------------------------------------------
Delphi Crazy Fans! 
I am a newbie of Delphi.
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行69.82422毫秒 RSS