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

1 delphi string unicode compatibility utf-8

我正在尝试使一些String处理例程与最新的delphi版本兼容.我正在使用Delphi2005和2007,但我不完全确定它的兼容性.

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

  1. a类型定义:

    {$IFNDEF UNICODE_STRING}  
    TextBuffer = Array[0..13] Of Char;   
    {$ELSE}  
    TextBuffer = Array[0..13] Of WideChar;  
    {$ENDIF}
    
    Run Code Online (Sandbox Code Playgroud)

    无用与否?在Unicode字符串之前是Char类型(成为什么)WideChar,还是存在差异?

  2. 功能:

    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;
    
    Run Code Online (Sandbox Code Playgroud)

    Word()的投射是否正常?

    这里也有' '问题.如何在Unicode版本中处理空间?我是否还应该使用该指令来区分' '和/ ' '或将' '自动处理为2字节的空白?

  3. 跳线:

    NewLineBegin := CanReadText( aPTextBuffer, #13#10 );
    
    Run Code Online (Sandbox Code Playgroud)

    如何#13#10在Unicode版本中解释第二个参数()?它兼容吗?它会被转换为字节块00130010吗?如果没有,那么该指令应该与常量一起使用#0013#0010吗?

Dav*_*nan 7

首先要做的是阅读MarcoCantú关于Unicode的论文:http://edn.embarcadero.com/article/38980

问题1

只需在没有条件代码的情况下始终使用Char,它将适用于新旧.

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

问题2

Char是一种序数类型,所以你可以写if s[i]<#21.

您还需要为字符串启动循环,因为它们使用基于1的索引.

问题3

不需要写#0013,#13很好.

简而言之,几乎所有编写良好的代码都不需要更改.