Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

마이그레이션 작업시 알아 두어야 할 유니코드 핵심 내용 및 샘플소스


Recommended Posts

유니코드가 도입 되면서 과거 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 로 할당 하는 경우이므로 당연히 오류가 생기겠지만 마이그레이션 과정에서는 일어 나지 않는 경우일 것이므로 그 내용만 숙지 하고 있으면 될 것 같다.

* 샘플소스 실행 데모

 

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.