c2design 12월 15일, 2022에 포스트됨 공유하기 12월 15일, 2022에 포스트됨 유니코드가 도입 되면서 과거 2 Byte 크기였던 char가 4 Byte로 크기가 확장 되었다. 따라서 char 와 String 으로 선언된 코드를 그대로 사용하면 신규버전에서는 4 byte 크기인 WideChar 와 WideString 으로 인식한다. 그러므로 2 Byte 크기의 char 와 String 을 그대로 유지 하고 싶다면 AnsiChar 와 AnsiString으로 바꿔서 선언하면 된다. 그리고 유니코드 도입전에 4 byte 크기로 사용 했던 WideChar 와 WideString 은 현재버전에도 코드 호환성 차원에서 남겨 두었으므로 그대로 사용하여도 되고 char 와 String으로 바꿔서 사용해도 무방하다. 델파이 현재 버전에서는 String = UnicodeString = WideString 으로 보면 된다. 유니코드를 이해하기 위한 샘플 전체 소스 unit UMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TMForm = class(TForm) Memo1: TMemo; Memok: TMemo; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); private procedure MyMsg(mTitle, mStr : string); { Private declarations } public { Public declarations } end; var MForm: TMForm; aStr, astrEng : AnsiString; uStr, uStrEng : String; // = UnicodeString aChar : AnsiChar; uChar : char; implementation {$R *.dfm} procedure TMForm.MyMsg( mTitle, mStr : string ); begin MemoK.Lines.add( mTitle + ' : ' + mStr ); end; procedure TMForm.Button1Click(Sender: TObject); var wStr : WideString; // = String begin MemoK.Lines.Clear; wStr := '가나다라마바사'; MyMsg( 'WideStr', wStr ); aChar :='a'; MyMsg( 'aChar', aChar ); MyMsg( 'aChar', pChar( aChar ) ); // PChar 는 AnsiChar 를 WideChar 로 형변환 해줌 aChar :='가'; MyMsg( 'aChar', aChar ); uChar :='가'; MyMsg( 'uChar', uChar ); end; procedure TMForm.Button2Click(Sender: TObject); begin MemoK.Lines.Clear; aStr := '가나다라마바사'; uStr := '가나다라마바사'; MyMsg( 'AnsiStr', aStr ); // [dcc32 Warning] UMain.pas(56): W1057 Implicit string cast from 'AnsiString' to 'string' MyMsg( 'String 형변환', String( aStr ) ); // String 으로 형변환 하여 Warning 제거 MyMsg( 'UnicodeStr', uStr ); end; procedure TMForm.Button3Click(Sender: TObject); begin MemoK.Lines.Clear; aStr := '가나다라마바사'; uStr := '가나다라마바사'; astrEng := 'abcdefg'; ustrEng := 'abcdefg'; MyMsg( 'aStr Length' , Length( aStr ).ToString ); // 한글은 글자수 * 2 MyMsg( 'aStr sizeof' , sizeof( aStr[1] ).ToString ); MyMsg( 'uStr Length' , Length( uStr ).ToString ); // 글자수와 길이 동일 MyMsg( 'uStr sizeof' , sizeof( uStr[1] ).ToString ); ustr := 'abcde한글'; MyMsg( 'abcde한글', Length( ustr ).ToString ); end; procedure TMForm.Button4Click(Sender: TObject); var I: Integer; begin MemoK.Lines.Clear; astr := 'abc한글도섞어서def'; ustr := astr; // Wide << Ansi MyMsg( 'ustr', ustr ); for I := Low( ustr ) to High( ustr ) do MyMsg( i.ToString, ustr[ i ] ); //-------------------------------------------------------------------- ustrEng := 'abcdefg'; astrEng := ustrEng; // Ansi << Wide : 사용하면 안되는 방식 MyMsg( 'astrEng', astrEng ); for I := Low( astrEng ) to High( astrEng ) do MyMsg( i.ToString, aStrEng[ i ] ); //-------------------------------------------------------------------- ustr := '가나다라마바사'; astr := ustr; // Ansi << Wide : 한글일 경우 문제 됨. MyMsg( 'astr', astr ); for I := Low( astr ) to High( astr ) do MyMsg( i.ToString, astr[ i ] ); end; procedure TMForm.Button5Click(Sender: TObject); var pch : pchar; archar : array [0..99] of AnsiChar; begin pch := 'abc한글'; MyMsg( 'pch', pch ); astr := StrPas( pch ); MyMsg( 'StrPas', astr ); MyMsg( 'String 형변환', string( pch ) ); StrPCopy( archar, astr ); MyMsg( 'StrPCopy', archar ); end; end. 위에 첨부된 샘플 소스를 실행하면서 그 결과를 확인해 보면 유니코드 적용전 과거 델파이 버전의 코드들을 현재 버전에서 어떻게 변환하여 사용해야 하는지 확인 할 수 있다. 실행 결과와 함께 컴파일시에 Warning 메시지를 잘 볼 필요가 있다. String에 AnsiString 타입을 할당 했을때 나오는 메시지는 데이터만 맞게 표출 된다면 무시 하여도 되나 Warning 메시지를 제거 하고 싶으면 String 으로 형 변환 해주면 된다. WideString 을 AnsiString 으로 할당 하는 경우는 4 Byte 를 2 Byte 로 할당 하는 경우이므로 당연히 오류가 생기겠지만 마이그레이션 과정에서는 일어 나지 않는 경우일 것이므로 그 내용만 숙지 하고 있으면 될 것 같다. * 샘플소스 실행 데모 1 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.