Delphi 2009 : 유니 코드 UTF-8의 검색 건너 뛰기 디아크리트
문제
아랍어 텍스트가 포함 된 UTF-8 인코딩 파일이 있고 검색해야합니다.
내 문제는 Diacritics입니다. 검색 방법을 건너 뛰는 방법은 무엇입니까?
인터넷 익스플로러에 해당 텍스트를로드하는 것처럼 (HTML Ofcourse에서 텍스트를 변환), 즉, 해당 디아크리닉을 건너 뛰고 있습니까?
도움이 있습니까?
edit1: 검색은 다음 코드를 사용하여 간단히 수행됩니다.
var m1 : TMemo; //contains utf-8 data)
m2 : TMemo; // contains results
...
m2.lines.BeginUpdate;
for s in m1.Lines do
begin
if pos(eSearch.Text,s)>0 then
begin
m2.Lines.Add(s);
end;
end;
m2.Lines.EndUpdate;
edit2: 유니 코드 데이터의 예 :
Diacritics없는 문자 만 검색하면 قُلْ이 찾을 수 없을 것입니다.
해결책
나는 디아크리닉이 유일한 문제가 아니라는 것을 알았습니다.
나는 캐릭터 교체를하고, 빈 줄로 대체하고, 텍스트 'أ' ''إ '' 'آ'도 'ا'로 변환되며 또한 ى ئ Â 우리에게도 동일한 작업을 수행 할 것입니다. .
검색의 경우 "Khoja Stemmer"(Java Source 여기)
보다 진보 된 방법은 그렇게하는 것입니다 트렉:
- 구두점을 제거하십시오
- 코퍼스의 대부분은 약한 모음이 포함되어 있지 않았습니다.
- 사전 항목 중 일부에는 약한 모음이 포함되어 있습니다. 이것은 모든 것을 일관되게 만들었습니다.
- 비 문자를 제거하십시오
- 초기 إ 또는 إ를 Bare alif로 교체하십시오
- ا로 교체하십시오
- 시퀀스 ىء를 ئ로 교체하십시오
- Final ى를 뛰어드로 교체하십시오
- Final ة를 ه로 교체하십시오
- 스트립 6 접두사 : 정규화 된 단어의 시작부터 명확한 기사 (ف ال آال ، Á 야자 ، و وال ، ال ،) 및 و (및)
- 단어의 끝에서 10 개의 접미사 St Strip 10 접미사 Statting tant ا ي ة ، ه ، 우리 ، ، 우리 ه ، ين ، ون
이 수정 된 텍스트로 텍스트를 색인화하고 (원래 텍스트에 단어의 색인을 저장하는 메모의 경우) 검색 쿼리에 대해 동일한 작업을 수행합니다.
나는 또한 줄을 하나씩하지 않고 memo1.text에서 검색 할 것입니다. 검색은 줄의 끝에 있고 다음 줄로 포장 될 수있는 여러 단어에 대해 검색 할 수 있습니다.
다른 팁
Vista+에서 당신은 아마도 (아랍어에 대한 경험이 없음) 사용할 수 있습니다. 비교 옵션 linguistic_ignorediacritic.
Norm_ignorenonspace도 도움이 될 수 있습니다. 다시, 그렇지 않을 수도 있습니다.
또는 (그러나 나는 단지 추측하고 있습니다) 당신은 당신의 줄을 GetStringTypeex 수동으로 디아크리닉을 제거합니다. 아마도 당신은 전화해야 할 것입니다 폴드 스트링 또는 MultibyteWideChar 플래그 MAP_COMPOSITE를 먼저 사용합니다.