델파이 2009 부터 기본 문자열 캐릭터셋으로 UnicodeString이 사용됩니다.

유니코드 지원에 따른 델파이 변경사항을 알아봅니다.

 

* 아래 제목을 클릭해 원하는 내용으로 바로 이동할 수 있습니다.

 

유니코드 지원에 따른 델파이 변경사항

  - 문자열 데이터 타입 선언의 변경

  - 문자열 길이와 데이터 크기의 변경

유니코드 검토 대상 분석 도구 안내

 

 데이터 타입

 유니코드 지원하지 않는 버전

 (델파이 2007 이전)

 유니코드 지원하는 버전

 (델파이 2009 이후)

 string

 AnsiString

 UnicodeString

 Char

 AnsiChar

 WideChar

 PChar

 PAnsiChar

 PWideChar

 PAnsiChar

 PAnsiChar

 PAnsiChar

 PWideString

 PWideChar

 PWideChar

 AnsiString

 AnsiString

 AnsiString

 WideString

 WideString

 WideString

 

string으로 선언된 데이터 타입들은 이제 UnicodeString으로 사용됩니다. 또, Char 타입은 WideChar으로, PChar 타입은 PWideChar으로 사용됩니다. 명시적인 PAnsiChar, AnsiString, PWideChar, WideString은 유지됩니다.

 

이 변경에 의해 검토할 사항은, 코드상에서 string과 AnsiString 또는 PAnsiChar를 혼용해서 사용하는 코드를 검토하고 수정해야 합니다. string과 AnsiString 또는 PAnsiString을 혼용해 사용하는 경우 데이터 크기의 차이에 따라 데이터 손실이 발생할 수 있습니다. 자세한 내용은 “문자열의 메모리 크기 변경” 항목을 참고하시기 바랍니다.

 

대표적으로 검토해야 할 항목은 다음과 같습니다.

 

1, UnicodeString과 AnsiString을 혼용해서 사용하는지 검토

2, 데이터 형변환 시 데이터 타입 검토

3, 윈도우 API 호출하는 코드 검토

4, 외부 라이브러리(DLL 등) 인터페이스 검토

5, 데이터베이스 캐릭터셋 검토

 

UnicodeString과 AnsiString을 혼용해서 사용하는 경우

var UStr, UStr2: string;

  AStr: AnsiString;

begin

  UStr := ‘ケーシ’;

AStr := UStr;      // 출력 : ケ?シ

  UStr2 := AStr;     // 출력 : ケ?シ, 데이터 손실 발생

end;

string 변수를 AnsiString 변수에 할당하는 경우 데이터 손실이 발생할 수 있습니다.

 

데이터 형변환(Type Casting) 시 데이터 타입 검토 

var path: string;

begin

  path := 'C:\Program Files\Internet Explorer\iexplore.exe';

  WinExec(PAnsiChar(AnsiString(path)), SW_SHOW);

end;

PChar(PWideChar)로 형변환 시 string(WideString)을 전달, PAnsiChar로 형변환 시 AnsiString으로 전달해야 합니다. 만약, PAnsiChar(string)와 같이 형변환 시 string 변수의 첫글자만 전달될 수 있습니다.

 

윈도우 API 호출하는 코드 검토

문자열을 다루는 대부분의 윈도우 API는 AnsiString과 WideString용 API를 제공합니다. 델파이는 AnsiString과 WideString외에도 기본 문자열 캐릭터셋(string)을 제공합니다. 즉, string이 AnsiString에서 WideString으로 변경됨에 따라 윈도우 API도 WideString용 API를 사용하게 됩니다.

코드상에서 문자열 포인터를 만들어 전달 시 AnsiString 기반의 캐릭터를 이용할 경우 AnsiString용 API를 사용하도록 코드를 변경해야 합니다. 

 

다음과 같이 데이터 타입에 맞도록 문자열 포인터를 만들어 전달해야 합니다.

var AnsiStr: AnsiString;

Str: string;

begin

  OutputDebugString(PChar(Str));

  OutputDebugStringA(PAnsiChar(AnsiStr));

  OutputDebugStringA(PAnsiChar(AnsiString(Str))); // 강제로 AnsiString API를 이용해야 할 경우

end;

 

외부 라이브러리(DLL 등) 인터페이스 검토

외부 라이브러리(DLL)와 문자열을 주고 받을 경우 다음 경우에 따라 조치하기 바랍니다.

 

* 델파이로 직접 DLL을 제작한 경우

  - DLL의 export 메소드의 문자열 포인터 데이터 타입을 PChar 또는 PWideChar로 변경 후 다시 빌드해 사용합니다.

* DLL을 직접 제작하지 않은 경우

  -DLL에서 유니코드 지원 메소드를 제공하는지 확인합니다.

  - 만약, 제공하지 않는다면, DLL 인터페이스를 참고해 PAnsiChar 로 DLL Export 메소드의 데이터타입을 변경하고, PAnsiChar(AnsiString(string))와 같이 형변환해 데이터를 전달합니다.
    (이 경우 DLL로 전달하거나, 전달받는 문자열은 유니코드를 제공하지 않습니다.)

 

데이터베이스 캐릭터셋 검토

데이터베이스 연결 시 한글이 정상표시되는지 확인해야합니다.

만약, 한글이 정상표시되지 않는다면 연결설정의 캐릭터셋을 Unicode 또는 UTF8로 설정하기 바랍니다.

만약, FireDAC을 이용한다면, MapRules을 통해 AnsiString을 WideString으로 적용하는 규칙을 추가할 수 있습니다.

 

자세한 내용은 http://tech.devgear.co.kr/429974 링크를 참고하세요.

 

 

문자열 길이의 변경

UnicodeString 기반의 문자열의 길이는 문자의 종류와 관계없이 모두 1로 계산됩니다. AnsiString 기반의 문자열은 한글등의 멀티-캐릭터셋 문자의 경우 2로, 영문자/숫자/특수문자의 길이는 1로 계산됩니다.

 

 

 string(UnicodeString)

 AnsiString

 Length('한글1'); 

 3

 5

 

문자열 데이터 크기의 변경

UnicodeString 기반의 문자열은 모든 문자가 2Byte의 메모리를 사용합니다. 

widechar_ansichar.png

이제 더 이상 문자열의 길이와 문자열의 데이터 크기가 일치하지 않습니다. UnicodeString 문자열의 데이터 크기를 계산하려면 문자열의 길이 * SizeOf(Char)로 계산해야 합니다.

이 변경으로 검토할 대표적인 항목은 다음과 같습니다.

  1. 문자열 길이와 데이터크기가 같다고 간주한 코드
  2. Char 크기를 1로 간주해 길이를 직접 입력한 코드

 

var

  Count: Integer;

  Buf1, Buf2: Array[0..13] of Char;

begin

  Buf1 := ‘가나다라마바사아자차카타파하’;

 

  // 잘못됨: 길이를 직접 입력한 코드, 길이로 데이터 크기를 계산한 코드

Move(Buf1, Buf2, 14);

Move(Buf1, Buf2, Length(Buf1));

  // Buf2 = 가나다라마바사

 

  // 올바름: 문자열 길이와 문자 크기를 곱해 데이터 복사

  Move(Buf1, Buf2, Length(Buf1) * SizeOf(Char));

  // Buf2 = 가나다라마바사아자차카타파하

end;

 

검토해야하는 대표적인 키워드

 Length

 FillChar

 Read

 ReadBuffer

 Write

 WriteBuffer

 Copy

 Seek

 AllocMem

 GetMem

 StrAlloc

 AnsiStrAlloc

 Delete  Insert  Pos  LeftStr  RightStr  MidStr
 Move          

 

잠재적으로 수정될 필요가 있을 수 있는 코드

 

  •  “of Char” 텍스트와 “of AnsiChar” 텍스트를 검색하여 버퍼가 유니코드에 맞게 사용되었는지 확인합니다. 
  •  “string[” 텍스트를 검색하여 스트링 인덱스의 문자가 대입되는 변수가 Char(즉 WideChar)가 아닌 AnsiChar 타입 변수로 지정되도록 수정합니다. 
  •  “AnsiString”, “AnsiChar”, “PAnsiChar”를 명시적으로 지정한 부분을 찾아 그럴 필요가 있고 제대로 되어 있는지 확인합니다. 
  •  “ShortString”을 명시적으로 지정한 부분을 찾아 그럴 필요가 있고 제대로 되어 있는지 확인합니다. 
  •  “Length(” 텍스트를 검색하여 Length가 SizeOf와 동일한 의미로 사용되지는 않았는지 확인합니다. 
  •  “Copy(” , “Seek(” , “Pointer(” , “AllocMem(”, “GetMem(” 텍스트를 검색하여 스트링 혹은 문자 배열에 대해 제대로 동작하는지 확인합니다.

 

소스코드를 대상으로 유니코드 적용 시 검토 대상을 분석 후 안내해 주는 도구입니다. 아래 링크에서 다운로드 할 수 있습니다.

unicode_statistics.png

 

 

위에서 설명한 각 키워드별 조치방법을 아래의 문서에서 찾아보시기 바랍니다.

 - [바로가기] 데브기어-마이그레이션-이슈공유 문서 보기

 

위 문서에도 원하는 답이 없다면 개발자 Q&A에서 검색 후, 결과가 없다면 질문을 등록해 다른 개발자들의 도움을 받아보시기 바랍니다.

 - [바로가기] 데브기어 개발자 Q&A

 

마이그레이션 참고 리소스


 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 21894
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 20529
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 22559
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 28320
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 29598
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 24939
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 45878
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 181430
50 [델파이 업그레이드 마이그레이션 무상 컨설팅] 체크리스트와 가이드(첨부 파일) [1] file 관리자 2012.02.08 12938
49 델파이 BDE에서 DBExpress로 마이그레이션 하기 기술 문서 file 박병일 2012.03.05 7392
» [마이그레이션] 유니코드 적용시 검토할 사항들 file 험프리 2014.08.21 7216
47 [C++mas] C++빌더 코드 64-bit로 마이그레이션하기 관리자 2012.12.21 5830
46 델파이 아래 버전에서 XE2로 마이그레이션시 별도의 리소스 파일이 필요 없는 경우 관리자 2012.07.05 5513
45 [따라하기] reFind 도구를 이용해 BDE 프로젝트를 FireDAC으로 마이그레이션 따라하기 [9] Humphery 2015.04.14 4224
44 reFind.exe: 마이그레이션 작업에서 수작업을 줄여주는 도구 Humphery 2015.04.09 4072
43 [마이그레이션] 64비트 적용 시 검토할 사항들 file 험프리 2017.02.08 3647
42 이전버전에서 최신버전으로 마이그레이션(업그레이드) 참고문서 Humphery 2014.02.28 3147
41 [마이그레이션] 함수(또는 변수)에 빨간밑줄이 가고 컴파일 시 Undeclared Identifier 오류 시 조치방법 file 험프리 2015.09.30 2447
40 [발표자료] 20190214 델파이 24주년 기념 세미나: 델파이 앱 현대화 방안 - 다양한 데이터 서비스 연동하기 관리자 2023.04.20 2162
39 [Step UP! 마이그레이션] RAD 업그레이드 마이그레이션 기술 브리핑 자료(2014.8.21) 관리자 2014.08.22 2013
38 [마이그레이션][팁] 유니코드 검토 대상 분석 도구 다운로드 [1] file 험프리 2015.11.16 1922
37 [마이그레이션] 컴파일러 버젼 [1] 험프리 2014.08.18 1801
36 이전 버전 C ++ 빌더 애플리케이션을 C ++ 빌더 10 시애틀로 마이그레이션 [1] file 김원경 2017.11.24 1699
35 바이너리 폼파일(*.dfm)을 텍스트 폼파일로 변경하는 도구 Humphery 2015.09.15 1540
34 20년된 델파이 앱을 현대식 마이크로서비스 아키텍처로 전환하기 관리자 2019.09.11 1509
33 [마이그레이션] 써드파티 컴포넌트 마이그레이션 방안 안내 험프리 2016.07.26 1486
32 [마이그레이션 사례] 감리교신학대학교 험프리 2016.08.25 1480
31 개발자가 고민하는 마이그레이션 논쟁 해소를 위한 7가지 핵심 방안 관리자 2018.02.19 1425