2012-09-29 45 views
0

我試圖將一些代碼從D2007移植到DXE2。 這個簡化的代碼在D2007中編譯得很好。在DXE2中,它顯示此錯誤:如何使用包含Unicode?

[DCC Warning] Unit1.pas(10): W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit. 
[DCC Error] Unit1.pas(37): E2010 Incompatible types: 'AnsiChar' and 'Char' 

這是一個unicode問題。 有人可以告訴我爲什麼會發生這種情況,我應該如何糾正它?

問候

代碼:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs; 

type 
    TSetOfChar = Set of Char; // Line 10 

    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    FCharacterSet: TSetOfChar; 
    public 
    property CharacterSet: TSetOfChar read FCharacterSet write FCharacterSet; 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    CharacterSet: TSetOfChar; 
    j: Integer; 
    s: String; 
begin 
    CharacterSet := []; 
    s := 'I''m just testing åäö'; 

    for j := 1 to Length(s) do 
    Include(CharacterSet, s[j]); // <- Line 37 

end; 

end. 

編輯:請注意,我用Delphi 2007中沒有仿製藥。我想要的代碼在D2007中仍然有效,因爲有很多代碼需要移植到Unicode。這是一個緩慢的過程。 當一切都移植,驗證它適用於XE2,那麼我們可以使用XE2的東西,如泛型。同時我們照常維護D2007,並且我們希望避免在版本控制系統中建立XE2分支。

+0

我認爲一個字典類型可能會提供一個類似於Delphi集合類型的「if x in set」操作的運行時速度,請考慮使用字典。包含將成爲「如果不是字典的一部分,然後添加此密鑰」操作的字典與Widechar鍵。 –

回答

8

這是標準的Unicode Delphi遷移飼料。必讀是MarcoCantù的論文 White Paper: Delphi and Unicode。如果您還沒有閱讀,請這樣做。如果您最近沒有閱讀過,請再次閱讀。

set of char產生警告的原因是集合的基本類型不能超過256個值。但是由於char現在是UTF-16,所以這比256更多。所有這些意味着你的代碼不能使用set和UTF-16字符。

您可以使用set of AnsiCharAnsiString。但是如果你想讓這個代碼在Unicode數據上工作,那麼你需要使用除set之外的其他東西。例如可以使用TList<char>

var 
    CharacterSet: TList<char>; 
    s: string; 
    c: char; 
..... 
CharacterSet := TList<char>.Create; 
s := 'I''m just testing åäö'; 
for c in s do 
    if not CharacterSet.Contains(c) then 
    CharacterSet.Add(c); 

我不會推薦生產。它的性能特點會很糟糕。基於哈希的字典會更好。最重要的將是一個專門的大套班。

最後一點。字符與UTF-16中的代碼點不同,後者是可變長度編碼。有問題的代碼和這個答案沒有考慮到這一點。

+0

+許多字符與UTF-16中的代碼點不同,它是一種可變長度編碼。 –

+0

請注意,我使用的是沒有泛型的Delphi 2007。也許TStringlist.Value是這裏最好的選擇? –

+0

如果您使用的是D2007,那麼您沒有Unicode,這是毫無疑問的。這個問題只適用於Unicode Delphi。 –

相關問題