2010-02-17 3 views
7

다양한 길이의 문자열을 탐색하고 나에 의해 정의 된 세트의 기호 (특히 일본어 문자)를 사용하여 작성된 프로그램 만 선택하는 프로그램을 작성해야합니다. 문자열에는 다른 언어 (독일어, 프랑스어, 아랍어, 러시아어, 영어 등)로 작성된 단어가 포함됩니다. 분명히 가능한 문자가 엄청나게 많습니다. 어떤 구조를 사용해야할지 모르겠다. 지금 델파이 7을 사용하고 있습니다. 아무도 그러한 프로그램을 작성하는 방법을 제안 할 수 있습니까?Delphi 7에서 유니 코드 문자열로 작업하기

답변

12

델파이 7의 VCL은 유니 코드 문자열을 인식하지 못하기 때문에 분명히 Delphi 2010을 사용하는 것이 좋습니다. Delphi 7에서는 WideString 유형과 WideChar 유형을 사용할 수 있으며 결과를 표시 할 수있는 사용자 인터페이스를 만들 때 TNT 유니 코드 구성 요소와 같은 구성 요소 세트를 설치할 수 있습니다.

매우 큰 세트 유형의 경우 TBits와 같은 비트 배열 사용을 고려하십시오. 길이가 65536 인 비트 배열은 모든 UTF-16 코드 포인트를 포함 할만큼 충분합니다. Char X가 Set Y에 있는지 확인하는 것은 기본적으로 다음과 같습니다.

function WideCharsInSet(wcstr:WideString; wcset:TBits):Boolean; 
var 
n:Integer; 
wc:WideChar; 
begin 
result := false; 
for n := 1 to Length(wcstr) do begin 
    wc := wcstr[n]; 
    if wcset[Ord(wc)] then 
     result := true; 
end; 
end; 

procedure Demo; 
var 
wcset1:TBits; 
s:WideString; 
begin 
wcset1 := TBits.Create; 
try 
    // 1157 - Hangul Korean codepoint I found with Char Map 
    wcset1[1157] := true;   
    // go get a string value s: 
    s := WideChar(1157); 
// return true if at least one element in set wcset is found in string s: 
    if WideCharsInSet(s,wcset1) then begin 
     Application.MessageBox('Found it','found it',MB_OK); 
    end; 

finally 
    wcset1.Free; 
end; 

end; 
+0

+1 답안의 모든 좋은 비트. bigsets, TNT와 D7에서이 작업을하지 않는 것이 좋습니다. –

+0

여기에 더 유용한 코드를 작성했습니다. Tofig –

+0

Delphi 2010 TStringList 클래스의 가장 큰 기능 중 하나는 디스크에서 파일을로드하고 바이트 마커에서 UTF8 또는 UTF16 인코딩을 자동으로 결정하는 기능입니다. 이것이 Tofig의 또 다른 부분 인 Tofig입니다. 2009/2010보다 오래된 Delphi 버전에서 더욱 까다로워 질 것입니다. –

5

또한 Delphi 2010으로 전환하는 것이 좋습니다 (왜 더 이상 2009 년을 귀찮게합니까?).

드물기는하지만 Mike Lischke의 Unicode Library이 다소 도움이 될 수 있습니다.

+0

링크가 깨졌습니다. – CyprUS

+0

@CyprUS, fixed! –

5

설명하는 방식으로 문자열을 간단하게 처리하려면 최신 컴파일러 및 유니 코드 사용 가능 프레임 워크로 업그레이드해야한다고 제안하지 마십시오. 유니 코드 지원 자체는 당연히 "유니 코드 버전"에서처럼 델파이의 "비 유니 코드"버전에서 (직접적으로) 액세스 할 수있는 기본 Windows API에 의해 제공됩니다.

질문에 설명 된 목적을 위해 필요한 모든 유니 코드 지원의 대부분은 the JEDI JCL에 제공된 유니 코드 지원에서 얻을 수 있다고 생각합니다.

모든 시각 구성 요소를 지원하려면 TNT control set이 무료라는 매력이 있어야합니다.

+0

+1, 훌륭한 주장. 수락 된 응답의 코드는 Delphi 4에서도 완벽하게 컴파일되고 작동합니다. – mghie

+0

Delphi조차도 Traddies와 최신 사람들로 나뉩니다. –

+1

저는 사람들이 "소란, 괴롭힘과 지출"을 최소화하고 "실제로 필요한 것이 무엇인지 생각하지 않고 변화를 위해 변화"하는 것으로 생각하는 것을 선호합니다. :) – Deltics

관련 문제