我正在尝试使一些字符串处理例程与
最新的德尔福版本。我正在使用 Delphi2005 和 2007,但我不完全确定兼容性。
这里有一些示例,它们是否与旧字符串类型和新字符串类型兼容?
(我将使用一个虚构的 STRING_UNICODE 指令)。
{$IFNDEF UNICODE_STRING}
TextBuffer = Array[0..13] Of Char;
{$ELSE}
TextBuffer = Array[0..13] Of WideChar;
{$ENDIF}
没用还是没用? Char 类型(变成原来的)是 Unicode 字符串之前的 WideChar,还是还有区别?
Function RemoveBlanks(Text: String): String;
Var
i: integer;
Begin
result := '';
For i:= 0 To Length(Text) Do
Begin
{$IFNDEF UNICODE_STRING}
If Byte(Text[i]) < 21 Then Continue;
{$ELSE}
If Word(Text[i]) < 21 Then Continue;
{$ENDIF}
If Text[i] = ' ' Then Continue;
Result := Result + Text[i];
End;
Word() 转换是否正常?
这里还有
' '
问题。空间如何处理在 Unicode 版本中?我是否也应该使用该指令来
区分
' '
和 ' '
或将' '
被自动处理作为 2 字节的空白?
NewLineBegin := CanReadText( aPTextBuffer, #13#10 );
第二个参数 (
#13#10
) 在 Unicode 版本中是如何解释的?它兼容吗?会不会被翻译成字节 block 00130010
?如果不是,那么该指令是否应该与常量 #0013#0010
一起使用? 最佳答案
首先要做的是阅读 Marco Cantú 的论文
统一码:http://edn.embarcadero.com/article/38980
问题 1
只需一直使用 Char 而不使用条件代码,它就可以在新旧版本中使用。
Char 是一种特殊类型,在旧版本的 Delphi 中是 8 位类型,在新的 Unicode 版本中是 16 位类型。
问题2
Char 是一个序数类型,所以你可以写 if s[i]<#21
.
对于字符串,您还需要从 1 开始循环,因为它们使用基于 1 的索引。
问题 3
不需要写#0013,#13 就可以了。
简而言之,几乎所有编写良好的代码都不需要更改。
关于string - 最新的 Delphi 编译器版本和字符串类型兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5736792/