Q&A

  • 한글Description을Copy로잘라올때깨지는문제
코드의 설명부분을 쿼리해서 Display할 때는

Copy를 써서 20자리만 잘라옵니다.

한글이 20자리에 걸리면 □이렇게 깨져서 출력됩니다.

깨지지않고 안전하게 잘라오는 방법을 알려주십시오.

1  COMMENTS
  • Profile
    김영대 1999.12.16 23:03
    남효숙 wrote:

    > 코드의 설명부분을 쿼리해서 Display할 때는

    > Copy를 써서 20자리만 잘라옵니다.

    > 한글이 20자리에 걸리면 □이렇게 깨져서 출력됩니다.

    > 깨지지않고 안전하게 잘라오는 방법을 알려주십시오.



    만약 70바이트 짜리 주소필드의 내용을 하나는 30바이트 나머지

    하나는 40바이트로 분리하여 주소를 2줄로 인쇄할경우가 있습니다

    그런데 copy() 를 써서 문자열의 앞부분 30바이트를 자르면

    영문은 상관없지만 한글의 경우는 30번째가 한글의 반쪽이면

    깨지게 됩니다

    아래 Get_KoreanCharPos 가 이를 판단하는 함수이며 예제를 포함

    했습니다





    function Get_KoreanCharPos(letter: string; WishCnt: Integer): Integer;

    var

    i, k, msb: integer;

    begin

    if System.Length(letter) < WishCnt then

    begin

    Get_KoreanCharPos := -1;

    System.Exit;

    end;



    msb := 0;

    for i := 1 to WishCnt do

    if (Integer(letter[i]) and Integer($80)) = Integer($80) then

    Inc(msb);



    if (msb mod 2) = 0 then {'$80'인것이 짝수개이면 완성된 한글문장}

    Get_KoreanCharPos := WishCnt

    else

    Get_KoreanCharPos := WishCnt - 1;

    end;





    이를 호출하여 사용하는 예제입니다



    {주소를 분리}

    i := Get_KoreanCharPos(Query1.FieldByName('ADDR').AsString, 30);

    if i = -1 then

    begin

    QRL_addr1.Caption := Query1.FieldByName('ADDR').AsString;

    QRL_addr2.Caption := '';

    end

    else

    begin

    QRL_addr1.Caption := Copy(Query1.FieldByName('ADDR').AsString,1,i);

    QRL_addr2.Caption := Copy(Query1.FieldByName('ADDR').AsString,i+1,40);

    end;