Delphi 2009에서 유니 코드 콘솔 응용 프로그램을 만들려면 어떻게해야합니까? 내가 이렇게 할 경우Delphi 2009의 유니 코드 콘솔 응용 프로그램
:
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
writeln('öüğşç سيمانتت');
end.
을 나는 다음 얻을 :
ougsc ???????
Delphi 2009에서 유니 코드 콘솔 응용 프로그램을 만들려면 어떻게해야합니까? 내가 이렇게 할 경우Delphi 2009의 유니 코드 콘솔 응용 프로그램
:
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
writeln('öüğşç سيمانتت');
end.
을 나는 다음 얻을 :
ougsc ???????
필자는 그게 무엇인지 모르겠지만 Windows API 함수를 사용하여 모든 32 비트 Delphi 버전에서 유니 코드 콘솔 응용 프로그램을 만들 수 있습니다. 난 그냥 델파이 4 시도 : 나는 편집기 작동에 유니 코드 문자열을 입력하는 방법을 시도 델파이 2009이없는
program test;
{$APPTYPE CONSOLE}
uses
Windows;
var
s: WideString;
i: integer;
Written: Cardinal;
begin
SetLength(s, 80);
for i := 1 to 80 do
s[i] := WideChar(48 + i);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), PWideChar(s), 80, Written,
nil);
end.
...
당신은 할 수 없습니다 (적어도 표준 라이브러리).
my_app.exe > unicode_file.txt
좋은 텍스트 unicode_file.txt 보는 시도 : 콘솔 기능 델파이에서 유일하게 비 유니 코드 함수입니다 2009 년
Delphi 2009가 실제로 완전한 유니 코드 인 경우이를 수행 할 수있는 방법이 있어야합니다. –
아니요, 콘솔은 유니 코드가 아닌 유일한 부분입니다. 나는 회의에서 코드 기어 연설자로부터 직접 그 정보를 가지고있다. –
이 정보를 제공해 주셔서 감사합니다. –
Windows 콘솔 유니있는 Charactes를 표시 할 수 없습니다, 그렇게 함께 파일에 출력을 보내려고 편집자.
창 콘솔은 유니 코드 문자를 표시 할 수 있습니다. 유니 코드 콘솔을 사용하는 몇 가지 프로그램이 있습니다. 출력을 파일로 재지 정하면 손상된 ansi 텍스트도 동일하게 나타납니다. –
@Kabrol을 : 래스터 글꼴 세트로 난 몰라 chars 중 하나를 참조하십시오. 그러나 Lucida Console을 사용하면 적어도 widechar ($ 11f) - ""를 볼 수 있습니다.
"SetConsoleOutputCP Only Effective with Unicode Fonts"을 참조하고 일반적으로 콘솔 API 함수에 대한 설명은 "Console Reference"입니다.
죄송합니다, 콘솔 글꼴을 잊어 버렸습니다 (디버그 모드로 실행했습니다). 고마워, 그것은 벡터 글꼴로 작동한다 (나는 콘솔 벡터 폰트를 "Courier New"로 바꿨다). –
Delphi 2009의 Writeln은 여전히 ANSI (System TTextRec 참조)를 사용하지만 UTF8Encode를 사용하고 SetConsoleOutputCP (CP_UTF8)를 호출하여 UTF8로 콘솔의 출력 코드 페이지를 UTF8로 변경할 수 있습니다. 실제로 유니 코드 문자를 표시하려면 좋은 글꼴이 필요합니다.
믿을 수 없음! 고마워, 그거야. Windows 콘솔이 UTF-8과 같은 멀티 바이트 문자 세트를 지원한다는 것을 알지 못했습니다. –
사실, 표준 WriteLn() 호출로이를 수행하는 방법이 있지만, Delphi 2009 RTL에서 버그를 패치하는 것과 관련이 있습니다. 사실, Delphi는 WriteLn에 대한 일부 컴파일러 마술을 수행합니다. UnicodeString 인수의 경우 _WriteUString이 호출됩니다. 이 메서드는 System.pas에서 볼 수 있지만 직접 호출 할 수는 없습니다. 그것에 _WriteLString에 대한 호출이 표시되지만 해당 메서드는 AnsiString 인수를받습니다. 따라서이 호출이 발생하면 UnicodeString이 AnsiString으로 다운 캐스팅됩니다.
해결책은이 UnicodeString-> AnsiString을 UnicodeString-> UTF8String 캐스트로 변환하는 것입니다. 이제
당신이 UTF8에 콘솔을 설정하면, 모든 문자는 그대로 통과한다 (그리고 예, 당연히 당신은 당신이 보여주고 싶은 문자를 지원하는 글꼴이 필요합니다) :
SetConsoleOutputCP(CP_UTF8)
이 RTL 수정을 위해 멋진 코딩 후킹이 필요합니다. 나는 이미 이것을했고, 나의 동료는 이것에 관한 기사를 쓰는 것으로 바쁘다. 온라인으로 사용할 수있게되면 링크를 게시합니다.
건배!
코드를 시도했습니다. 작동하지 않습니다. 와이드 문자 ($ 416) - "Ж", widechar ($ 11f) - "", widechar ($ 633 - "س")와 같은 ANSI가 아닌 유니 코드 문자를 테스트 했습니까? –
죄송합니다, 콘솔 글꼴을 잊어 버렸습니다 (디버그 모드로 실행했습니다). 고마워, 그것은 벡터 글꼴로 작동한다 (나는 콘솔 벡터 폰트를 "Courier New"로 바꿨다). –
WriteConsole은 리디렉션 된 출력 (예 : app.exe> file.txt)에 작동하지 않으므로 WriteConsole이 False를 반환하는지 확인한 다음 WriteFile을 대신 사용하십시오. WriteFile을 사용하면 유니 코드 또는 ansi를 쓸 수 있습니다. 일반적인 대부분의 응용 프로그램은이 경우 ansi를 사용합니다. – Alex