导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
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.
作者:
2011/4/11 16:10:14
1楼:
AnsiString是AnsiChar组成的是没错,汉字有两个字节组成的也是没错,但你的第二个例子把一个汉字(2个字节),赋给一个AnsiChar(1个字节)当然编译不过
----------------------------------------------
-
作者:
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.
作者:
2011/4/11 16:17:28
2楼:
WideChar可以这样试: var w:WideChar; s:WideString; begin s:='腾'; w:=s[1]; self.Caption:=w; end; delphi把'腾'当字符串了
----------------------------------------------
-
作者:
2011/4/11 21:21:19
3楼:
有点说不通啊,过去我们学习都是说汉字占两个字符的空间,widechar不正为汉字这类文字所生妈?
----------------------------------------------
Delphi Crazy Fans! I am a newbie of Delphi.
作者:
2011/4/11 23:16:37
4楼:
WideChar是给Unicode字符使用的,占两个字节纯属巧合。 就像螺丝刀和水果刀刚好一样长,但是你不能用螺丝刀去学水果。
----------------------------------------------
-
作者:
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/
作者:
2011/4/12 9:38:57
7楼:
有条件还是用用XE吧,毕竟D7实在太老了。
----------------------------------------------
-colin and yoyo http://blog.csdn.net/linzhengqun
作者:
2011/4/12 20:46:59
8楼:
我感觉各位还是没有完全的回答我的问题。
----------------------------------------------
Delphi Crazy Fans! I am a newbie of Delphi.
作者:
2011/4/13 0:57:00
9楼:
久远的历史问题,几句话回答不了。 看懂下面这个就明白了。 http://baike.baidu.com/view/684997.htm
----------------------------------------------
-
作者:
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
----------------------------------------------
-
作者:
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.
作者:
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的很好。
----------------------------------------------
-
作者:
2011/4/14 14:29:52
13楼:
明白了,谢谢!
----------------------------------------------
Delphi Crazy Fans! I am a newbie of Delphi.