String 最新的Delphi编译器版本和字符串类型兼容性

String 最新的Delphi编译器版本和字符串类型兼容性,string,delphi,unicode,utf-8,compatibility,String,Delphi,Unicode,Utf 8,Compatibility,我正在尝试使一些字符串处理例程与 最新的delphi版本。我使用的是Delphi2005和2007,但我不能完全确定它们的兼容性 以下是一些示例,它们是否与旧字符串类型和新字符串类型兼容? (我将使用一个虚构的字符串\ uUnicode指令) 类型定义: {$IFNDEF UNICODE_STRING} TextBuffer = Array[0..13] Of Char; {$ELSE} TextBuffer = Array[0..13] Of WideChar; {$ENDI

我正在尝试使一些字符串处理例程与 最新的delphi版本。我使用的是Delphi2005和2007,但我不能完全确定它们的兼容性

以下是一些示例,它们是否与旧字符串类型和新字符串类型兼容? (我将使用一个虚构的字符串\ uUnicode指令)

  • 类型定义:

    {$IFNDEF UNICODE_STRING}  
    TextBuffer = Array[0..13] Of Char;   
    {$ELSE}  
    TextBuffer = Array[0..13] Of WideChar;  
    {$ENDIF}
    
    是否无用?字符类型(变成以前的)是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;
    
    第二个参数(
    #13#10
    )在Unicode版本中如何解释?它兼容吗?是否将其转换为字节块
    00130010
    ?如果不是,那么该指令是否应与常量
    #0013#0010
    一起使用


  • 首先要做的是阅读马可·坎图的《关于 Unicode:

    问题1

    只要一直使用Char,而不使用条件代码,它就可以在新旧版本中工作

    Char是一种特殊类型,在旧版本的Delphi中是8位类型,在新的Unicode版本中是16位类型

    问题2


    Char是一种有序类型,因此如果s[i]你可以编写
    ,首先要做的是阅读Marco Cantú在
    Unicode:

    问题1

    只要一直使用Char,而不使用条件代码,它就可以在新旧版本中工作

    Char是一种特殊类型,在旧版本的Delphi中是8位类型,在新的Unicode版本中是16位类型

    问题2

    Char是一种序数类型,因此您可以编写
    if s[i]编译器指令
    一般来说,我建议您对编译器指令要非常谨慎。它们有其用途,但对于一般用途,它们可能应该完全避免

    第一个问题是,你必须编译你的应用程序并测试两次,因为指令开/关在本质上和/或细微上是不同的

    对于每个附加指令,这种情况会变得更糟,因为您通常必须排列组合:

    D1接通,D2接通
    D1打开,D2关闭
    D1关闭,D2打开
    D1关闭,D2关闭

    3个指令是8个排列。。。等等

    Unicode字符串 请参见:
    它有一些很好的答案供你考虑。

    问题1 如前所述,我建议不要这样做。在回答上述问题时,我还出于其他原因建议不要这样做

    更具体地说:

    • 在Delphi=2009中,两行实际上是相同的
    问题2 这不仅是出于与问题1相同的原因而不明智的,而且它实际上存在一些微妙的问题

    更精确的
    文本类型(字符串)由您的Delphi版本决定。因此:

    • 在Delphi=2009中,条件的if部分将双字节字符转换为一个字节。(信息丢失。)
    此外,还有一些特殊注意事项,以及针对“特殊”字符的新支持类。你会想调查一下的。参考:

    问题3 我非常确定#13将被视为单个字符,因此在Delphi>=2009中,Char==WideChar,字符将占用2个字节

    但是,在Delphi中再次查找
    Linebreak
    常量<代码>系统.sLinebreak
    可能早在Kylix时代就引入了。

    编译器指令 一般来说,我建议您对编译器指令要非常谨慎。它们有其用途,但对于一般用途,它们可能应该完全避免

    第一个问题是,你必须编译你的应用程序并测试两次,因为指令开/关在本质上和/或细微上是不同的

    对于每个附加指令,这种情况会变得更糟,因为您通常必须排列组合:

    D1接通,D2接通
    D1打开,D2关闭
    D1关闭,D2打开
    D1关闭,D2关闭

    3个指令是8个排列。。。等等

    Unicode字符串 请参见:
    它有一些很好的答案供你考虑。

    问题1 如前所述,我建议不要这样做。在回答上述问题时,我还出于其他原因建议不要这样做

    更具体地说:

    • 在Delphi=2009中,两行实际上是相同的
    问题2 这不仅是出于与问题1相同的原因而不明智的,而且它实际上存在一些微妙的问题

    更精确的
    文本类型(字符串)由您的Delphi版本决定。因此:

    • 在Delphi=2009中,条件的if部分将双字节字符转换为一个字节。(信息丢失。)
    此外,还有一些特殊注意事项,以及针对“特殊”字符的新支持类。你会想调查一下的。参考:

    问题3 我非常确定#13将被视为单个字符,因此在Delphi>=2009中,Char==WideChar,字符将占用2个字节

    但是,在Delphi中再次查找
    Linebreak
    常量<代码>系统。sLinebreak
    可能是在Kylix时代引入的。

    通用类型
    Char
    变成基本类型
    AnsiChar
    或基本类型WideChar(阅读通用与基本类型)。顺便说一句,已经为您定义了UNICODE符号$,但是在需要特定的字节大小之前,根本不需要分支

    第二部分闻起来,把它刮干净。这是对类型转换的滥用,并人为地造成了对条件编译的需要。要获取给定字符的无符号整数字符代码,请使用
    Ord()
    函数(或如另一个答案中所述,使用字符类型的顺序特征)

    对于第三部分,字符常量已经是泛型类型Char。同样,无需担心,
    #13
    变成字节大小的
    $0D
    或单词大小的
    $0D00NewLineBegin := CanReadText( aPTextBuffer, #13#10 );