일본어판을 개발하신다고 하니까...
우선 델파이를 어디서 컴파일 하느냐가 문제라고 생각됩니다..
델파이에서 사용하는 string은 ansi string 이고 다국어로 만들려고 하면다면 Wide String를 쓰셔야 합니다.
그래야 델파이에서 다른 언어를 표시할 수 있습니다...
물론 읽고 쓰는 것도 다국어로 써야 다른 운영체제( 일본어, 한국어) 제대로 읽어보고 쓸수 있습니다..
즉 다국어로 만들면 일본어판과 한국어 운영체제에서 모두 사용할수 있지만 그렇게 하면 우선 다국어를 지원하는 컴포넌트를 사용해야 되고 Ansi String으로 되어 있는 부분을 모두 Wide string으로 변경하셔야 합니다.
물론 사용하는 함수들도 모두 다국어로 변경하셔야 되구요..
왜 그렇해 해야 되냐구요...
간단히 설명 드리겠습니다.
windows 2000이상부터는 자체가 UniCode를 사용하여 다국어를 지원합니다. 이전버전은 안된다고 생가하시면 됩니다. 그런 2000이상도 이하 버전과 호환성을 위해서 Ansi와 Unicode를 같이 사용한다고 생각하시면 됩니다..
델파이에서 사용하는 string 은 ansi string이구요 이걸 사용해서 컴파일하고 일본어 운영체제에서 실행하면 다 깨져서 나옵니다. Ansi String 이 일본어로 동작하기 때문입니다....
만약 다국어로 만들기가 힘들다 그러면 일본어 운영체제에서 한글를 모두 일본어로 바꾸어서 컴파일하는 수밖에 없습니다.
음.. 위에서 단지 한국어 운영체제에서 일본어를 읽어 드릴려고 한다면 이건 WideString으로 써서 일거야 할겁니다...
TntComponent에 있는 파일 읽어 오는 부분을 사용해 보세요
소스 보니까 CreateFile 파일로 해서 읽어오는 부분이 있는데... 밑에 보시면 알시겠지만
CreateFile, CreateFileA -> Ansi String 으로 파일 객체를 만들때 사용하구요
CreateFileW -> uniCode 로 파일 객체를 생성할때 사용합니다..
그러니까 읽어올때부터 신경써서 작업을 해야 되겠죠...
function CreateFile; external kernel32 name 'CreateFileA';
function CreateFileA; external kernel32 name 'CreateFileA';
function CreateFileW; external kernel32 name 'CreateFileW';
위에 것은 간단한 예구요...
제가 TNTComponent를 참고 하라고 한것은 일단 컴포넌트를 설치 하시고
파일을 읽어 오는 부분부터 유니코드를 고려해서 읽어야 된다는 얘기입니다..
밑에 있는 소스는 Tntcomponent 에 있는 내용을 복사해서 올린 것입니다.
이렇게 하라는 얘기가 아니라요..
먼저 파일이 어떤 형식을 저장되어 있는가를 보고 어떻게 읽어올것인지 결정하시구요
파일에서 읽어오는데 성공하셨다면 그 다음부터는 WideString에 담아서 화면에 뿔려 주시면 됩니다
그때 memo 보다는 Tnt에 있는 메모 컴포넌트를 사용하세요.
그럼 알아서 표시가 될것입니다..
제가 간단히 샘플을 만들고 싶지만 파일이 어떤 형식을 저장되어 있느지 몰라서요..
procedure TTntStrings.LoadFromFile(const FileName: WideString);
var
Stream: TStream;
begin
Stream := TTntFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
FLastFileCharSet := AutoDetectCharacterSet(Stream);
Stream.Position := 0;
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
function AutoDetectCharacterSet(Stream: TStream): TTntStreamCharSet;
var
ByteOrderMark: WideChar;
BytesRead: Integer;
Utf8Test: array[0..2] of AnsiChar;
begin
// Byte Order Mark
ByteOrderMark := #0;
if (Stream.Size - Stream.Position) >= SizeOf(ByteOrderMark) then begin
BytesRead := Stream.Read(ByteOrderMark, SizeOf(ByteOrderMark));
if (ByteOrderMark <> UNICODE_BOM) and (ByteOrderMark <> UNICODE_BOM_SWAPPED) then begin
ByteOrderMark := #0;
Stream.Seek(-BytesRead, soFromCurrent);
if (Stream.Size - Stream.Position) >= Length(Utf8Test) * SizeOf(AnsiChar) then begin
BytesRead := Stream.Read(Utf8Test[0], Length(Utf8Test) * SizeOf(AnsiChar));
if Utf8Test <> UTF8_BOM then
Stream.Seek(-BytesRead, soFromCurrent);
end;
end;
end;
// Test Byte Order Mark
if ByteOrderMark = UNICODE_BOM then
Result := csUnicode
else if ByteOrderMark = UNICODE_BOM_SWAPPED then
Result := csUnicodeSwapped
else if Utf8Test = UTF8_BOM then
Result := csUtf8
else
Result := csAnsi;
end;
답변 주셔서 감사합니다...
이렇게 열심히 설명해 주셨는데... 아직도 해결을 못했습니다..;;(정말 죄송합니다..)
이번엔 샘플로 쓰실 파일도 같이 첨부해 드리겠습니다.
말씀하신대로 바이너리 파일(EXE 나 DLL 등)에서 보통 HEX에디터 등에서 읽을 수 있는
문자열들을 읽어 오는게 목적입니다.
일단 파일 자체는 유니코드로 쓰여있지 않은 것 같습니다.
(샘플 파일과 같은 형식입니다. SHIFT-JIS 로..)
이런 형식일때도 유니코드로 읽어와야하나요?
그리고 쪽지로 말씀 드렸다시피.. 컨포넌트 설치법을 잘 모르겠습니다..;;
쪽지에서 어떻게해서 설치는 된것 같다고 말씀 드렸었지만 결국 정상 작동하진 않았으니까요;;;
정말...정말 죄송하지만 다시 한번 도와 주셨으면 합니다..
샘플은 Text 파일 이지만 업로드가 되지 않아 확장자만 ZIP 로 바꿨습니다.
(즉 압축된 파일이 아닙니다. 그대로 제 프로그램에서 불러오시면 됩니다.)
이 파일을 불러오신 후 띄는 Edit 박스에 0 이라고 입력하시고 확인을 클릭하시면
왼쪽에 깨진 일본어(한글 폰트로 표기된 일본어)가 나타납니다.
그 부분을 일본어로 표시되도록만 하면 됩니다.
그러니까 한글운영체제에서 다국어가 아닌 파일을 읽어오면 우리나라 코드에 맞게 일어 오는거죠..
ansiString 으로 읽어온다는 소리는 제가 했을겁니다..
즉 간단히 설명하면 똑같은 테스트 파일이라도
한국 운영체제
ansistring -> 가나다라
일본 운영체제
ansistring -> 가나다라 -> 가나다라 가 아니라 일본어에 맞는 코드가 들어가 있는거죠..
처음에 ansiString은 미국에서 자기내 언어 1바이트만 생각하고 만들어서 모든 언어를 표시 할수 없었습니다.
그래서 나라마다 코드가 다 틀려서 호환이 되지 않았지요..
그래서 개발한것이 uniCode 입니다..
그래서 해결 방밥이 없냐.. 그러치는 안습니다..
일단 테스트 파일을 일반적인 방법으로 읽어드린 다음 일본어 코드로 바꿔 주면 됩니다..
function StringToWideStringEx(const S: AnsiString; CodePage: Cardinal): WideString;
위에 있는 함수는 tntsystem 에 있는 걸로 가피 해 왔습니다...
구지 Tnt 를 인스톨하지 않아도 됩니다. 거기서 함수만 끌어와서 사용하세요
우에 있는 건 테스트 파일을 해당 codepage 에 맞게 unicode로 바꿔 줍니다.
우리나라 코드는 949로 알고 있는데 일본꺼는 뭔지 모르겠네요..
한번 찾아보세요.. 어떻게 해당 언어의 코드 페이지를 찾으시면 쉽게 찾을 수 있을겁니다..
아니면 구글이나 그런곳에서 949 unicode 이렇게 하면 하면 관련 정보가 많이 나올듯 싶습니다..
이정도면 거의 답을 드린것 같은데...
Tnt 컴포넌트를 쉽게 구할수 잇으니까 올리지는 않습니다..
간단히 정리하면
우선 파일에서 스트링으로 파일의 내용을 가져온다 그리고 일본어로 코드롤 변환한다.
다음으로 유니코드를 표시할수 있는 컴포넌트로 화면에 표시한다..
이렇게 하면 되네요.. 근데 유니코드 표시 하려면 Tnt 컴포넌트 꼭 잇어야 되겠네요.. 참고로 델파이 7부터는 기본으로 있다고 들었습니다.
function StringToWideStringEx(const S: AnsiString; CodePage: Cardinal): WideString;
var
InputLength,
OutputLength: Integer;
begin
if CodePage = CP_UTF7 then
Result := UTF7ToWideString(S) // CP_UTF7 not supported on Windows 95
else if CodePage = CP_UTF8 then
Result := UTF8ToWideString(S) // CP_UTF8 not supported on Windows 95
else begin
InputLength := Length(S);
OutputLength := MultiByteToWideChar(CodePage, 0, PAnsiChar(S), InputLength, nil, 0);
SetLength(Result, OutputLength);
MultiByteToWideChar(CodePage, 0, PAnsiChar(S), InputLength, PWideChar(Result), OutputLength);
end;
end;
일본어판을 개발하신다고 하니까...
우선 델파이를 어디서 컴파일 하느냐가 문제라고 생각됩니다..
델파이에서 사용하는 string은 ansi string 이고 다국어로 만들려고 하면다면 Wide String를 쓰셔야 합니다.
그래야 델파이에서 다른 언어를 표시할 수 있습니다...
물론 읽고 쓰는 것도 다국어로 써야 다른 운영체제( 일본어, 한국어) 제대로 읽어보고 쓸수 있습니다..
즉 다국어로 만들면 일본어판과 한국어 운영체제에서 모두 사용할수 있지만 그렇게 하면 우선 다국어를 지원하는 컴포넌트를 사용해야 되고 Ansi String으로 되어 있는 부분을 모두 Wide string으로 변경하셔야 합니다.
물론 사용하는 함수들도 모두 다국어로 변경하셔야 되구요..
왜 그렇해 해야 되냐구요...
간단히 설명 드리겠습니다.
windows 2000이상부터는 자체가 UniCode를 사용하여 다국어를 지원합니다. 이전버전은 안된다고 생가하시면 됩니다. 그런 2000이상도 이하 버전과 호환성을 위해서 Ansi와 Unicode를 같이 사용한다고 생각하시면 됩니다..
델파이에서 사용하는 string 은 ansi string이구요 이걸 사용해서 컴파일하고 일본어 운영체제에서 실행하면 다 깨져서 나옵니다. Ansi String 이 일본어로 동작하기 때문입니다....
만약 다국어로 만들기가 힘들다 그러면 일본어 운영체제에서 한글를 모두 일본어로 바꾸어서 컴파일하는 수밖에 없습니다.
음.. 위에서 단지 한국어 운영체제에서 일본어를 읽어 드릴려고 한다면 이건 WideString으로 써서 일거야 할겁니다...
TntComponent에 있는 파일 읽어 오는 부분을 사용해 보세요