2008-11-05 7 views

답변

9

필자는 그게 무엇인지 모르겠지만 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. 

...

+0

코드를 시도했습니다. 작동하지 않습니다. 와이드 문자 ($ 416) - "Ж", widechar ($ 11f) - "", widechar ($ 633 - "س")와 같은 ANSI가 아닌 유니 코드 문자를 테스트 했습니까? –

+0

죄송합니다, 콘솔 글꼴을 잊어 버렸습니다 (디버그 모드로 실행했습니다). 고마워, 그것은 벡터 글꼴로 작동한다 (나는 콘솔 벡터 폰트를 "Courier New"로 바꿨다). –

+1

WriteConsole은 리디렉션 된 출력 (예 : app.exe> ​​file.txt)에 작동하지 않으므로 WriteConsole이 False를 반환하는지 확인한 다음 WriteFile을 대신 사용하십시오. WriteFile을 사용하면 유니 코드 또는 ansi를 쓸 수 있습니다. 일반적인 대부분의 응용 프로그램은이 경우 ansi를 사용합니다. – Alex

5

당신은 할 수 없습니다 (적어도 표준 라이브러리).

my_app.exe > unicode_file.txt 

좋은 텍스트 unicode_file.txt 보는 시도 : 콘솔 기능 델파이에서 유일하게 비 유니 코드 함수입니다 2009 년

+0

Delphi 2009가 실제로 완전한 유니 코드 인 경우이를 수행 할 수있는 방법이 있어야합니다. –

+0

아니요, 콘솔은 유니 코드가 아닌 유일한 부분입니다. 나는 회의에서 코드 기어 연설자로부터 직접 그 정보를 가지고있다. –

+0

이 정보를 제공해 주셔서 감사합니다. –

0

Windows 콘솔 유니있는 Charactes를 표시 할 수 없습니다, 그렇게 함께 파일에 출력을 보내려고 편집자.

+0

창 콘솔은 유니 코드 문자를 표시 할 수 있습니다. 유니 코드 콘솔을 사용하는 몇 가지 프로그램이 있습니다. 출력을 파일로 재지 정하면 손상된 ansi 텍스트도 동일하게 나타납니다. –

1

@Kabrol을 : 래스터 글꼴 세트로 난 몰라 chars 중 하나를 참조하십시오. 그러나 Lucida Console을 사용하면 적어도 widechar ($ 11f) - ""를 볼 수 있습니다.

"SetConsoleOutputCP Only Effective with Unicode Fonts"을 참조하고 일반적으로 콘솔 API 함수에 대한 설명은 "Console Reference"입니다.

+0

죄송합니다, 콘솔 글꼴을 잊어 버렸습니다 (디버그 모드로 실행했습니다). 고마워, 그것은 벡터 글꼴로 작동한다 (나는 콘솔 벡터 폰트를 "Courier New"로 바꿨다). –

10

Delphi 2009의 Writeln은 여전히 ​​ANSI (System TTextRec 참조)를 사용하지만 UTF8Encode를 사용하고 SetConsoleOutputCP (CP_UTF8)를 호출하여 UTF8로 콘솔의 출력 코드 페이지를 UTF8로 변경할 수 있습니다. 실제로 유니 코드 문자를 표시하려면 좋은 글꼴이 필요합니다.

+0

믿을 수 없음! 고마워, 그거야. Windows 콘솔이 UTF-8과 같은 멀티 바이트 문자 세트를 지원한다는 것을 알지 못했습니다. –

0

사실, 표준 WriteLn() 호출로이를 수행하는 방법이 있지만, Delphi 2009 RTL에서 버그를 패치하는 것과 관련이 있습니다. 사실, Delphi는 WriteLn에 대한 일부 컴파일러 마술을 수행합니다. UnicodeString 인수의 경우 _WriteUString이 호출됩니다. 이 메서드는 System.pas에서 볼 수 있지만 직접 호출 할 수는 없습니다. 그것에 _WriteLString에 대한 호출이 표시되지만 해당 메서드는 AnsiString 인수를받습니다. 따라서이 호출이 발생하면 UnicodeString이 AnsiString으로 다운 캐스팅됩니다.

해결책은이 UnicodeString-> AnsiString을 UnicodeString-> UTF8String 캐스트로 변환하는 것입니다. 이제

당신이 UTF8에 콘솔을 설정하면, 모든 문자는 그대로 통과한다 (그리고 예, 당연히 당신은 당신이 보여주고 싶은 문자를 지원하는 글꼴이 필요합니다) :

SetConsoleOutputCP(CP_UTF8) 

이 RTL 수정을 위해 멋진 코딩 후킹이 필요합니다. 나는 이미 이것을했고, 나의 동료는 이것에 관한 기사를 쓰는 것으로 바쁘다. 온라인으로 사용할 수있게되면 링크를 게시합니다.

건배!

+0

"Homer 's Odyssey"와 같은 기사가 이미 있기 때문에 바퀴 달린 소리가납니다. http://edn.embarcadero.com/article/39022 – mjn

+0

아마 눈치 채지 못했을 지 모르겠지만 이것은 정확히 제가 말한 기사입니다. - 동료 인 Marjan Venema가 쓴 글 (당신이 자세히 보면 제 이름은 몇 번 나타납니다). 어쨌든 링크를 추가해 주셔서 감사합니다. 그리고 네, 실제로 오디세이처럼 읽습니다! – PatrickvL