Q&A

  • 저도.. 질문 하나 해도 되죠? 일본어 변환 관련입니다..
안녕하세요?

일본어 윈도우에서 만들어진 텍스트를 한글 윈도우에서 보면 깨집니다.

이것을 한글 윈도우에서도 잘 보이게 컨버팅 하는 방법이 따로 있나요?

이쪽은 제가 잘 몰라서...ㅜㅜ

일본어 파일명을 한글윈도우에서 일본어로 잘 보이게 바꾸어보려고 합니다.

혹시 아시는 분 계신가요? ^^

SHIFTJIS 쪽으로 아무리 검색해도.. 답이 없네요..쩝
8  COMMENTS
  • Profile
    홍성락 2008.07.29 04:42
    텍스트를 저장시 UTF-8로 저장 안하면 타언어에서는 100% 읽기 어렵습니다.
    만약 UTF-8코드로 저장하면 UTF8Decode로해서 타언어OS에서 읽으면 되는데,
    보통 안씨로했다면 읽기는하되 100%번역이 안됩니다
    아래 테스트는
    1. UTF-8가 로저장하지 않은 한국어텍스트를 일본어OS에서 읽기입니다
    2. UTF-8가 로저장하지 않은 일본어텍스트를 한국어OS에서 읽기입니다
    3. UTF-8가 로저장란 일본어텍스트를 한국어OS에서 읽기입니다
    3번은 Unicode컴포넌트를 사용하면 읽어집니다
    필요한 예제 텍스트 파일은 자료실에 예제로 등록합니다

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

    type
    TranslateListRecord = record
    ID : int64;
    RecordText : WideString;
    end;
    TranslateListRecordPointer = ^TranslateListRecord;

    UnicodeResClass = class
    resourceStringList : TList;
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    procedure LoadResourceStr(stream : TStream; UniCodeOK :Boolean);
    end;

    TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}
    ////////////////////////////////////////////////////////////////////////////////
    constructor UnicodeResClass.Create;
    begin
    resourceStringList := TList.Create;
    end;

    destructor UnicodeResClass.Destroy;
    begin
    Clear;
    resourceStringList.Free;
    inherited;
    end;
    procedure UnicodeResClass.LoadResourceStr(stream: TStream; UniCodeOK :Boolean);
    var
    strings : TStringList;
    i : integer;
    index : integer;
    aRecord : TranslateListRecordPointer;
    s : WideString;

    begin
    Clear;
    if stream <> nil then begin
    strings := TStringList.Create;
    strings.LoadFromStream(stream);
    i := 0;
    while i < strings.Count do begin
    if UniCodeOK then s := UTF8Decode(strings[i])
    else s := (strings[i]);

    New(aRecord);
    aRecord.RecordText := s;
    resourceStringList.Add(aRecord);
    if not TryStrToInt(Copy(s,pos('=',s)+1,length(s)), index) then
    aRecord.ID := -1
    else
    aRecord.ID := index;

    Inc(i);
    end;
    strings.Free;
    end;
    end;

    procedure UnicodeResClass.Clear;
    var
    i : integer;

    begin
    for i := 0 to resourceStringList.Count - 1 do
    Dispose(TranslateListRecordPointer(resourceStringList[i]));
    resourceStringList.Clear;
    end;

    ////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.Button1Click(Sender: TObject);
    var
    GDK30Res : UnicodeResClass;
    resourceStream : TFileStream;
    i : integer;
    aRecord : TranslateListRecordPointer;
    begin
    Memo1.Font.Charset := HANGEUL_CHARSET;//SHIFTJIS_CHARSET;
    Memo1.Font.Name := 'MS Sans Serif'; //'MS Pゴシック'
    GDK30Res := UnicodeResClass.Create;
    GDK30Res.Clear;
    resourceStream := TFileStream.Create(ExtractFilePath(Forms.Application.ExeName) + 'TransLang1042.lng', fmOpenRead);
    GDK30Res.LoadResourceStr(resourceStream, False);
    for i := 0 to GDK30Res.resourceStringList.Count-1 do begin
    aRecord := GDK30Res.ResourceStringList[i];
    if aRecord <> nil then
    Memo1.Lines.Add(aRecord.RecordText);
    end;
    resourceStream.Free;
    GDK30Res.Free;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var
    GDK30Res : UnicodeResClass;
    resourceStream : TFileStream;
    i : integer;
    aRecord : TranslateListRecordPointer;
    begin
    Memo1.Font.Charset := SHIFTJIS_CHARSET;
    Memo1.Font.Name := 'MS Pゴシック';
    GDK30Res := UnicodeResClass.Create;
    GDK30Res.Clear;
    resourceStream := TFileStream.Create(ExtractFilePath(Forms.Application.ExeName) + 'TransLang1041.lng', fmOpenRead);
    GDK30Res.LoadResourceStr(resourceStream, False);
    for i := 0 to GDK30Res.resourceStringList.Count-1 do begin
    aRecord := GDK30Res.ResourceStringList[i];
    if aRecord <> nil then
    Memo1.Lines.Add(aRecord.RecordText);
    end;
    resourceStream.Free;
    GDK30Res.Free;
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    var
    GDK30Res : UnicodeResClass;
    resourceStream : TFileStream;
    i : integer;
    aRecord : TranslateListRecordPointer;
    begin
    Memo1.Font.Charset := SHIFTJIS_CHARSET;
    Memo1.Font.Name := 'MS Pゴシック';
    GDK30Res := UnicodeResClass.Create;
    GDK30Res.Clear;
    resourceStream := TFileStream.Create(ExtractFilePath(Forms.Application.ExeName) + 'ResourceStrings.txt', fmOpenRead);
    GDK30Res.LoadResourceStr(resourceStream, True);
    for i := 0 to GDK30Res.resourceStringList.Count-1 do begin
    aRecord := GDK30Res.ResourceStringList[i];
    if aRecord <> nil then
    Memo1.Lines.Add(aRecord.RecordText);
    end;
    resourceStream.Free;
    GDK30Res.Free;
    end;

    end.

  • Profile
    홍성락 2008.07.29 05:04
    메모장에서 저장시 UTF-8로하면 타언어OS에서 메모장으로 보면 보이는데 델파이에서 보통 Memo로는 안되고 Unicode의 Memo컴포넌트로는 보입니다, uni컴포 올리긴 뭐해서자료실에 올리는건 어렵겠네요...흑!
    내일 델2007에서 해보려는데 되런지~
  • Profile
    이정욱 2008.07.29 08:50
    감사합니다.

    그런데 위의 함수들을 응용하면 일본어로 된 파일 이름을 한글윈도우에서 제데로된 일본어..(표현하기가 참 어렵네요....) 파일이름으로 변환도 가능한지요?

    아직 해보질 않아서..

    jZip 이라는 프로그램이 일본어 파일명을 한글윈도우에서 제데로 풀어주는것을 봤는데, 그 부분을 저도 구현해보려고 합니다. ^^

    답변해주셔서 감사합니다.
  • Profile
    양영필 2008.07.31 19:45
    파일명을 처리하실 거라면 유니코드로 처리하면 되지 않을까요?
    FindFirstFileW 처럼 W붙은 유니코드 함수로요.
  • Profile
    이정욱 2008.08.01 03:59
    양영필님/ 그게... 실제 하드에 존재하는 파일이 아니라, 이미 압축 파일안에 저장되어있는 파일이라서요 ^^; 그래서 코드 변환이 가능한 방법이 있는지 질문 올린거에요 ^^ 그런데, 홍성락님께서 알려주신 방법으로는 해결이 안되네요..ㅜㅜ
  • Profile
    홍성락 2008.08.01 05:55
    그렇지요.잠깐 해보려다 지금 조금 바빠서리..디폴드론 어렵네요.
    만약에 압축 파일안에 헤더가 있다면 그 헤더에 UTF-8형식으로 파일명리스트가 있다면
    위의 3번 예제에서 (TForm1.Button3Click) 처럼 읽어서 TntMemo로 읽은후 에 그메모장에서 읽으면 안되나 싶네요...
    해보지 않아서요...탐색기나 워드등 처럼 파일명을 읽는 방법만 알면 저도 써먹을때 많은데....
  • Profile
    양영필 2008.08.01 19:25
    어째 이상하다 했네요 ㅠ.ㅜ

    예전에 봤던 윈도우 API중에 MultiByteToWideChar가 있는데 혹시 찾으시는게 아닐까 싶어서 올려봅니다.

    검색해보니 중국사이트쪽에 String 변환적용한 코드가 있더군요.

    function StringToWideStringEx(const S: String; CodePage: Word): WideString;
    var
    L: Integer;
    begin
    L:= MultiByteToWideChar(CodePage, 0, PChar(S), -1, nil, 0);
    SetLength(Result, L-1);
    MultiByteToWideChar(CodePage, 0, PChar(S), -1, PWideChar(Result), L - 1);
    end;
    //---------------------------------------------------------------------
    function WideStringToStringEx(const WS: WideString; CodePage: Word): String;
    var
    L: Integer;
    begin
    L := WideCharToMultiByte(CodePage, 0, PWideChar(WS), -1, nil, 0, nil, nil);
    SetLength(Result, L-1);
    WideCharToMultiByte(CodePage, 0, PWideChar(WS), -1, PChar(Result), L - 1, nil, nil);
    end;

    저도 일본어 관련 파일 찾아서 한번 해봐야겠네요
  • Profile
    이정욱 2008.08.02 00:23
    양영필님/ 헤헤.. 그거 이미 해봤었는데... 공백으로만 결과가 나옵니다.ㅜㅜ
    • 인레인
    • 2008.08.05 05:06
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 깔쌈보이
      2008.08.05 18:53
      말씀하신 형태의 구조로 개발을 하시면 유지관리에 있어서 여러가지 문제가 동반될것입니다. 조그만 캡...
    • Crazy™
      2008.08.07 19:23
      일반적으로 모듈별로 나눠서 하죠. 깔삼보이님 말처럼 개별개별 dll로 작업해서 호출을 하던가, 또는 ...
    • Jung
    • 2008.08.04 20:01
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 깔쌈보이
      2008.08.05 18:59
      델파이 7의 한계가 아닌가 합니다. 기존 컴포넌트를 교체하지 않으시면 거의 불가능하지 않을까 합니다....
    • 홍성락
      2008.08.06 22:31
      그쵸...기존걸 조금 수정하고 기존 검포넌트도 유지하면서 델파이 내부 api로만 하기엔 어렵습니다. 거...
    • 김영석
    • 2008.08.04 17:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.08.05 23:58
      Rave 컴포넌트도 업그레이드되어서 어느정도 변경이 있을 수 있겠지만... 버전에 맞게 새로 구매해서 사...
    • 델피
    • 2008.08.03 23:27
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 장종운
    • 2008.08.02 18:42
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 장종운
      2008.08.02 19:29
      initialization OleInitialize(nil); 를 삽입하면 된다는데 어디에 넣는지 좀 가르쳐 주세요 ~
    • 장성호
      2008.08.05 00:09
      음... 원인은 그것이 아닌것 같습니다. 아래 링크를 참조하세요 http://cbuilder.borlandforum.com/i...
    • 이정욱
      2008.08.08 22:05
      인디의 http 컴포넌트를 사용하시면 됩니다. var Stream: TFileStream; URL: string; FileNa...
    • 이승우
      2008.08.08 22:11
      감사합니다^^ 아직 시간이 안 되서 테스트는 못해보았지만, 커다란 기대를 해 봅니다. 축복 많이 받...
    • 이승우
      2008.08.09 20:54
      다시 한번 감사드립니다. 다운되는 것을 확인했습니다. 그런데, 다운 받는 상황을 볼 수가 없어서 ...
    • 이정욱
      2008.08.09 22:38
      OnWork 이벤트를 이용하세요..
    • 정명수
      2010.07.01 03:21
      다른 파일을 받으려고 하면 안되나요 ? *.stp(3D 캐드파일) 파일을 해봤더니 에러가 나네요. ...
    • 석주현
      2008.08.02 19:32
      음 그냥 regsrv32.exe 유틸을 이용해서 프로그램 설치 시에 수동으로 flash9f.ocx 를 설치하면 됩니다. ...
    • 이승우
      2008.08.02 21:40
      빠른 답변에 감사를 드립니다. 축복 받으실 꺼에요^^ 제가 만든 플을 배포하려고 하는데 수동으로 ...
    • 석주현
      2008.08.03 04:18
      uses 절에 ComObj를 추가하시고 RegisterComServer('flash9f.ocx'); 아래와 같이 해서 코드로 등록...
    • 김호정
    • 2008.08.01 19:47
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.08.01 20:57
      흠.... 리얼그리드에 데이터를 입력할 때 20081024를 2008-10-24로 변경해서 입력해주시면 될것 같은데요...
    • 김호정
      2008.08.01 21:03
      데이터를 쿼리에서 불러오는거라서여;; 수정은 안되여;;; 리얼그리드에다가 넣기만 하는거라..수정이 안...
    • 최용일
      2008.08.01 21:25
      쩝~ 같은말인데요... 쿼리 결과를 불러서 코딩으로 넣어주는 것이라면 위와 같이 하시면 될것같구요... ...
    • 김호정
      2008.08.01 22:12
      아....그렇군요.!! SELECT nvl(START_DATE,' '),nvl(END_DATE,' ') from T_PROGRAM SQL게이트 오...
    • 최용일
      2008.08.01 22:18
      쿼리를 바꾸는것보다는 쿼리 결과를 표현하는 방식을 바꾸는것이 더 좋을듯한데요... 쿼리를 바꾸면 쿼...
    • 최용일
      2008.08.02 05:00
      아마도 HostData[i, 8], HostData[i, 9]에 날짜가 20081024형식으로 들어 있는것 같은데.... 쩝~ 이런한...
    • 김호정
    • 2008.08.01 02:29
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.08.01 02:49
      퀵리포트의 OnNeedData이벤트에서 리얼그리드의 데이터를 하나씩 읽어오세요.
    • 김호정
      2008.08.01 02:52
      그렇게 하나씩 불러들이는것이... 자세히 말씀하시면 어떻게..해야되는거죠? QRlabel1.Caption : ...
    • 한기동
      2008.08.01 19:02
      저같으면~ ㅎㅎ 리얼그리드 내용을 하나씩 읽어서 퀵레포트에다 뿌리는건 좀 그러네요 리어그리드 내...
    • phono
      2008.08.01 20:05
      저도, 한기동님의 방법에 한표 드립니다. ^^ OnNeed 로 처리는 시간과 노력동원이... ㅎㄷㄷ 합니다.
    • steps
      2008.07.31 00:10
      새 ActiveX Form 프로젝트를 하나 연 다음에 닫는게 아니라 file/new/other/activex/activex form 으로 ...
    • 민성필
      2008.07.31 01:19
      답변 너무 감사합니다. ActiveX 폼 추가군요. 제가 너무 대충 봐서 몰랐는데, 이 녀석이 애초부터 Ac...
    • steps
      2008.07.31 02:07
      ??? 혹 폼파일이 아니고 프레임의 pas파일이 아닌가요? 저는 프레임에 모든걸 올려놓구 보통 폼우에 이 ...
    • 후초보
    • 2008.07.30 20:10
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.07.30 22:14
      아래 코드는 윈도우 전영역을 캡션바와 같이 인식하는 건데요.. 결국 윈도우를 그냥 드래그 하면 움직여...
    • 구창민
      2008.07.31 18:46
      안녕하세요.. bsSizeable 는 BoderStyle 을 말씀하시는 거겠죠? 그리고, 제목표시줄에서 드래그라 하...
    • 이영수
    • 2008.07.30 18:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.07.30 22:15
      자료실에 보시면 exif 정보를 가지고 오는 소스가 있습니다. exif로 검색해 보시면 됩니다.
    • KDDG_Hit
    • 2008.07.30 02:50
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.07.30 08:50
      ItemCount가 1일때는...그냥 Exit 하게 하시면 문제 없을거 같은데요 ^^
    • KDDG_Hit
      2008.07.30 19:26
      그게 그런 꽁수를 쓰면 안되는 로직이라서요.. 그것보다 큰 문제는 제가 테스트겸 따로 만든 프로그램...
    • 최용일
      2008.07.30 21:01
      코딩에는 특별히 이상이 없는것 같은데요... 어차피 Item Count가 1이면 Sort할때 Compare함수로 넘어가...
    • KDDG_Hit
      2008.08.01 17:55
      리스트에 있는 아이템이 문제라는게 저도 이상합니다. 리스트상에 있는건 CollectionItem 한개가 들어...
    • 최용일
      2008.07.30 21:04
      뭐... 별다른 처리를 할것은 없는것 같은데요... 파라매터를 넘겨주고 넘겨받는 방식에 따라서 약간은 ...
    • 김용일
    • 2008.07.29 01:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 가을바람
      2008.07.29 06:46
      유동ip를 고정 ip로 만들수는 없읍니다.. 고정ip는 전용선을 쓰는게 유일한방법이고요.. 전용선은 비싸...
    • 김양훈
    • 2008.07.29 00:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2008.07.29 02:46
      아래를 정리해서 사용하세요 <!--CodeS--> unit Unit1; interface uses Windows, Messa...
    • 이정욱
    • 2008.07.29 00:16
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2008.07.29 04:42
      텍스트를 저장시 UTF-8로 저장 안하면 타언어에서는 100% 읽기 어렵습니다. 만약 UTF-8코드로 저장하면 ...
    • 홍성락
      2008.07.29 05:04
      메모장에서 저장시 UTF-8로하면 타언어OS에서 메모장으로 보면 보이는데 델파이에서 보통 Memo로는 안되고 ...
    • 이정욱
      2008.07.29 08:50
      감사합니다. 그런데 위의 함수들을 응용하면 일본어로 된 파일 이름을 한글윈도우에서 제데로된 일본...
    • 양영필
      2008.07.31 19:45
      파일명을 처리하실 거라면 유니코드로 처리하면 되지 않을까요? FindFirstFileW 처럼 W붙은 유니코드 함...
    • 이정욱
      2008.08.01 03:59
      양영필님/ 그게... 실제 하드에 존재하는 파일이 아니라, 이미 압축 파일안에 저장되어있는 파일이라서요...
    • 홍성락
      2008.08.01 05:55
      그렇지요.잠깐 해보려다 지금 조금 바빠서리..디폴드론 어렵네요. 만약에 압축 파일안에 헤더가 있다면...
    • 양영필
      2008.08.01 19:25
      어째 이상하다 했네요 ㅠ.ㅜ 예전에 봤던 윈도우 API중에 MultiByteToWideChar가 있는데 혹시 찾으시...
    • • • •
    • 가을바람
      2008.07.29 06:46
      선배 !! 아니 이제 실시간방송까지..ㅎㅎㅎ
    • 이정욱
      2008.07.29 08:57
      방법은 있겠죠... 그런데 질문이 너무 간단하셔서....ㅡㅡ; 설마..실시간 방송 출력 풀 소스를 원하시...
    • 장종운
    • 2008.07.25 18:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.07.25 19:18
      Form 의 프로퍼티 창을 보시면 BorderIcons 라는 항목이 있습니다. 그 부분을 펼처 보시면 원하시...