귀하는 손님 이십니다
로그인
회원가입
  
  델마당 공식 은행계좌
  하나은행 227-910235-83607
  예금주 이상국(운영진)
프로젝트 게시판
투표게시판
델마당소개
기초부터 활용까지! 델파이 교육 - 데브기어
 광고문의 :
lazarus lazarus 입니다.
글내용 - lazarus
 rawbytestring 패치.
파르셀
(김도완)
2015-10-22 오후 8:59:54
1685회 조회


첨부파일 다운로드
rawbyte_concat_enhanced_fix_multi.zip
 utf8 문자열과 lazarus가 말썽이길래, 최근 버그리포트도 있고 해서 열심히 만들어봤습니다.
이 패치를 적용하면, rawbytestring에 대해 인코딩 변환을 하지 않는 문자열 합치기를 합니다.

 실제로 rawbytestring은 인수에만 사용되거나, 변수로 사용해도 ansistring같이 처리되고 있는데, 이게 결국 lazarus내부에서 utf8 문자열과 합쳐질 때, 인코딩이 망가져 알 수 없는 문자가 되는 현상이 있곤 합니다.

 대표적인게 memo의 add를 했을 경우인데, 인수로 제대로 넘어가지만 lazarus내부에서 인코딩이 깨지곤 합니다.

 그 문제에 대한 삽질을 좀 해봤습니다.

 할당되는 변수가 rawbytestring이거나 문자열 합치기 앞에 rawbytestring타입 캐스팅을 하면 문자열의 인코딩에 상관없이 그냥 더하기만 합니다.

program project2;
uses
  sysutils;
var
  s1 : string;
  sw, sh : widestring;
  s2, s3, s4, s5, dumps : string;
  s : string;
  i : integer;
begin
  s1:='1234';
  s2:='Größe ÄÜÖ';
  s3:='abcd';
  s5:='한글';
  sw:=UTF8Decode(s2);
  s2:=UTF8Encode(sw);
  s4:=UTF8Encode(sw);
  sh:=utf8decode(s5);
  s5:=#199#209;
  //s5:=ansitoutf8(s5);
  s :=rawbytestring(s1+s2)+rawbytestring(s3+s4)+rawbytestring(s4+s5);
  s :=rawbytestring(s1+s2+s3+s4+s5)+rawbytestring(s1+s2+s3+s4+s5)+utf8string(s1+s2+s3+s4+s5);
  dumps:='';
  for i:=1 to Length(s) do begin
    dumps:=dumps+' '+IntToHex(Byte(s[i]),2);
  end;
  writeln(s,' ',dumps);
  readln;
end.

대충 이런 패턴으로 사용할 수 있습니다.