2012-09-29 6 views
0

일부 코드를 D2007에서 DXE2로 이식하려고합니다. 이 간단한 코드는 D2007에서 잘 컴파일됩니다. DXE2에서이 오류가 표시됩니다.유니 코드와 함께 사용하는 방법?

[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' 

아마도 유니 코드 문제입니다. 누군가가 왜 이런 일이 일어나고 어떻게 해결해야하는지 말해 줄 수 있습니까?

감사

코드 :

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. 

편집 : 나는 아무 제네릭이없는 델파이 2007을 사용하고 참고. 유니 코드로 포팅하는 코드가 많아서 D2007에서 여전히 작동하는 코드를 원합니다. 이것은 느린 과정입니다. 모든 것이 이식되면 XE2에서 작동하는지 확인한 다음 generics와 같은 XE2를 사용할 수 있습니다. 그 동안 우리는 평소와 같이 D2007을 유지 관리하고 있으므로 개정 관리 시스템에서 XE2 분기를 피하기를 원합니다.

+0

사전 형식은 델파이 집합 유형의 "집합 x 일 경우"연산에 필적하는 런타임 속도를 제공 할 수 있다고 생각합니다. 대신 사전을 사용하는 것이 좋습니다. Include는 "사전의 일부가 아닌 경우에는이 키 추가"작업을 사전에 Widechar 키와 함께 사용합니다. –

답변

8

이것은 표준 유니 코드 델피 마이그레이션 도구입니다. 필요한 독서는 Marco Cantù의 논문 White Paper: Delphi and Unicode입니다. 그것을 읽지 않았다면 그렇게하십시오. 최근에 읽지 않았다면 다시 읽으십시오.

set of char이 경고를 표시하는 이유는 집합의 기본 형식이 256 개를 초과 할 수 없기 때문입니다. 그러나 char이 이제 UTF-16이기 때문에 256보다 훨씬 많습니다.이 모든 것이 코드가 집합과 UTF-16 문자로는 작동하지 않는다는 것을 의미합니다.

set of AnsiCharAnsiString을 사용할 수 있습니다. 그러나이 코드가 유니 코드 데이터에서 작동하도록하려면 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

제네릭이없는 델파이 2007을 사용하고 있습니다. 어쩌면 TStringlist.Value가 가장 좋은 옵션일까요? –

+0

D2007을 사용하는 경우 유니 코드가 없으므로 의문의 여지가 없습니다. 이 질문은 Unicode Delphi에서만 의미가 있습니다. –

관련 문제