안녕하십니까?
항상 초보인가 봅니다. ㅠㅠ;
다른게 아니고 음.. 한글 문제인데요....
1. dbf에서 필드길이가 120이고요.. 그것을 읽어서 paradox나 sybase에 필드길이가 60인 필드에
내용을 집어넣어려고 하는데요.. 문제는 dbf의 한글이 완성형(?)인가 뭔가더라고요 그래서
스페이스도 2자리를 차지하구요.. 그런데 실제 읽어들일땐 또 틀려요.. ㅠㅠ
예 가나다 라 마바사 - 일반적인 한글
가나다 라 마바사 - 제가 고민하는 한글
2. 1번은 그렇다 치고요.. 음 120자리를 80자리까지 끊어서 copy(str,1,80) 이런거요...
할때 스페이스나 영문자등이 있으면 (홀수개로요... ) 한글이 2자리를 차기하기 때문에 반토막이
나는건 아실겁니다.
그래서 전 이렇게 처리하려고 했걸랑요.
try
Table1.FieldByName('A').AsString := copy(str,1,80); // ①
except
str := copy(str,1,length(str)-1); // 그러니까 여기서 깨진 제일 뒷자리를 날린다는거죠..
Table1.FieldByName('A').AsString := str;
end;
그런데 문제는 ①에서 아예 멈춰버린다는 겁니다. ㅠㅠ; 엄청 황당합니다.
이런 깨진 문자들 때문인지 깨진 한글이 있는 필드를 인덱스로 잡은 경우 테이블이 완전 먹통이 되는
경우도 발생합니다. sybase의 경우 DB가 아예 다시 로딩되지도 않구요...
3. 그래서 다시 하나 생각해 낸것이 widestr 입니다. 이건 한글도 하나씩 읽어들이더군요...
문제는 깨진 문자가 끝에 있을경우 이것을 문자로 인식하는지 안하는지 문제입니다.
그래서 한글과 영문이 이것저것 포함된 문자를 두고 string과 widestring으로 각각 받아서
이것을 한자씩 잘라봤습니다. 그리고 잘린문자와 그 문자의 길이를 listbox 2개에 넣어 보았습니다.
procedure TForm1.BitBtn1Click(Sender: TObject);
var
str1 : WideString;
str2 : String;
Loop : Integer;
tmpname : String;
begin
ListBox1.Items.Clear;
ListBox2.Items.Clear;
// Edit1에는 'asdcd김명찬#@34asd바보'라고 입력... ^^;
str1 := Edit1.Text;
str2 := Edit1.Text;
tmpname := 'asdcd김 명찬#@34as d바보 ';
Label1.Caption := '전체길이 : ' + inttostr(length(soo));
Label2.Caption := '전체길이 : ' + inttostr(length(soo2));
for Loop := 1 to Length(Soo) do
ListBox1.Items.Add(Copy(Soo, Loop, 1) +'-' + inttostr(length(Copy(Soo, Loop, 1))));
for Loop := 1 to Length(Soo2) do begin
ListBox2.Items.Add(Copy(Soo2, Loop, 1) + '-' + inttostr(length(Copy(Soo, Loop, 1))));
Label3.Caption := Copy(tmpName,1,Length(tmpName)-Loop);
Label3.Refresh;
end;
end;
결과는
WideString은 무조건 길이를 1로 잡습니다. 그리고 String은 기본적인건 다 아시다시피 한글은 2 그외 나머지는 1인거 그리고 깨진 문자중 일부는 1로 일부는 0이라고 하는군요..
이래도 문제가 되는건 깨진 문자를 WideString이 어떻게 인식하는가 입니다.
고수님들 제바 도와주십시오.....
2의 ①에서 바로 멈추는건 어떻게 해볼 도리가 없네요... ㅠㅠ
변수형 일반 문자열이 아니라 WideString로 처리 하였습니다.