델파이에서 스트링의 처리를 위해 아래와 같이 Copy 내장함수를 많이들 사용한다.
Copy(문자열, 시작인덱스, 자르고픈길이)
문제는 자르고픈 길이가 글자수가 아닌 byte라는점이다. 델파이에선 한글이 DBSC 즉, 2바이트 문자로 인식 되기 때문.. 이를 해결할 방법을 알아보자.
DBCS (Double Byte Character Set)
DBCS란 하나의 문자를 나타내는데 16비트 즉 2바이트를 사용하는 문자셋을 의미한다. 델파이에서 숫자, 영문, 특수기호는 1byte로 처리되며 한글의 경우 DBCS 문자로 2바이트로 처리된다.
델파이에서 한글 스트링 길이를 조정하기 위해 Copy 함수를 사용하는 경우... 2바이트 문자가 절반으로 토막(?)내는 무시무시한 기능으로 인해 한글이 깨지는 현상이 발생한다. 이를 해결하기 위한 방법으로는 ByteType이라는 함수를 사용해야만 한다.
Delphi Inner function - ByteType()
String 변수의 n 번째 문자열이 DBCS 문자인의 첫번째 바이트인지, 두번째 바인트인지 혹은 1바이트 문자인지를 반환해준다. SysUtils 에 정의된 함수 원형은 아래와 같다.
function ByteType(const S: string; Index: Integer): TMbcsByteType;
반환되는 TMbcsByteType은 mbSingleByte(1바이트 문자), mbLeadByte(2바이트 시작문자), mbTrailByte(2바이트 마지막문자) 중에 하나의 값을 가지게 된다.
String이 아닌 PChar형인 경우에는
function StrByteType(Str:PChar; Index: Chardinal): TMbcsByteType; 을 사용하면 된다.
ByteType을 사용한 문자열 마지막 문자 확인하기
대부분 문제가 발생하는 경우는 Copy 함수로 문자열을 자를때 마지막 글자가 한글이 1byte로 반토막나는 경우이다. 이를 해결하기 위해 아래의 함수를 참조하자.
function RecoveryHalfKR(input : string) : string;
begin
result := input;
# 입력문자열 마지막 바이트가 2byte 시작문자인지 확인.
if ByteType(result, length(result)) = mbLeadByte then
begin
# 마지막 반토막난 2바이트 시작문자를 문자열에서 잘라낸다.
result := Copy(result, 1, length(result)-1 );
end;
end;
사용자 배려가 없는 함수들을 보면 Delphi는 참 투박하고 얄짤(?)없는 언어인듯하다.
끄읕.