代码页即为字符集编码,也称为"内码表"。
在Unicode出现以前,计算机依靠不同的代码页来显示不同的语言。我们最常用的代码页有两个:936 简体中文和437 英文。
Delphi中可以为AnsiString指定代码页。
type TStr = type AnsiString(936); var S: TStr;
这样我们就定义了一个代码页是936的字符串S。
显然,同一个字码在不同的代码页中很可能代表不同的字符。来看下面这个例子:
type
TStr1 = type AnsiString(437);
TStr2 = type AnsiString(936);
var
s1: TStr1;
s2: TStr2;
begin
s1:= '══';
SetLength(s2,2);
Move(s1[1],s2[1],2);
writeln(s1);
writeln(s2);
readln;
end
首先分别定义了英文代码页和简体中文代码页的字符串。然后把字符串“══”赋给s1(这是连续两个双横表格框线“═”,字符编码205(十六进制$CD),并非等号“=”)。接着给s2设定两个字节的长度,把s1第一个字符开始的两个字节的数据拷贝给它。注意这里不能用s2:= s1。由于字符串本质上是指针,如果简单地使用赋值语句的话会让s2直接指向s1所指向的数据区,这时两个字符串就完全一样了。
显示结果:
s2变成了一个中文字符:屯。
这是因为437代码页中的连续两个单字节字符到了936代码页中被看作了一个双字节字符,而“屯”的字码正好是$CDCD。
用过Free Pascal的人对这个一定不会陌生。