2013-03-03 2 views
1

저는 C++로 새로운 명령 행 응용 프로그램을 작성했습니다. 물론 우리가 지원하는 플랫폼은 Windows입니다.Windows C++ 콘솔 응용 프로그램에서 wchar_t/wmain을 사용하는 것이 합리적입니까?

기본적으로 Windows 콘솔은 로캘에 따라 OEM 코드 페이지를 사용합니다 (예 : 내 컴퓨터에서는 CP437/DOS.Western 임). 윈도우 키릴 문자 버전이라면 CP866이 될 것입니다. 이러한 OEM 코드 페이지는 256 자만 포함합니다.

Windows 콘솔은 입력 키 스트로크를 기본 코드 페이지를 기반으로 문자로 변환한다는 것을 의미하는 것으로 생각합니다. 현재 선택한 글꼴에 따라 해당 글리프가 있으면 표시됩니다.

  1. 그런 경우에는 내 응용 프로그램에서 wmain/wchar_t와 넓은 char 유형을 사용하는 것이 합리적인지 여부는 무엇입니까?
  2. 넓은 유형을 사용하면 어떤 이점이 있습니까? 아니면 char * 만 사용하면 심각한 문제가 발생합니까?
  3. 넓은 문자 유형을 사용하는 경우 명령 행 인수 및 환경 문자열의 인코딩은 무엇입니까 - (wchar_t * argv [] 및 wchar_t * envp []). Windows CRT에 의해 UTF-16으로 변환 되었습니까? 아니면 변경되지 않았습니까?

귀하의 기여에 감사드립니다.

답변

1

Windows가 내부적으로 지정된 코드 페이지에서 작동한다고 가정하는 것처럼 보입니다. 그건 사실이 아니야. Windows는 내부적으로 유니 코드 (UTF-16)로 작동합니다. wchar_t 대신 char을 사용하는 레거시 소프트웨어의 경우 입력 및 출력이 지정된 코드 페이지로 변환됩니다.

나는 이것이 의미하는 것은 Windows 콘솔 인 기본 코드 페이지

이 정확하지 않습니다에 따라 문자로 입력 키 스트로크를 변환 생각합니다. 키 스트로크와 (유니 코드) 문자의 매핑은 키보드 레이아웃에 의해 정의됩니다. 이는 코드 페이지와 완전히 독립적입니다. 예 : 키릴 코드 페이지를 사용하는 시스템에서 중국어 자판 배열을 사용할 수 있습니다.

  1. 그것이 방법을 권장, 그것은 완전히 wchar_t를 사용하는 것이 있습니다뿐만 아니라.
  2. 예, 장점이 있습니다. 프로그램이 Windows에서 지원하는 모든 문자를 처리 할 수 ​​있습니다. char을 사용하면 현재 코드 페이지에없는 문자를 처리 할 수 ​​없습니다.
  3. 그들은 변환되지 않습니다 - 즉 UTF-16 문자 그대로 있습니다.

불행히도 명령 프롬프트 자체는 'ANSI'응용 프로그램이므로 ANSI의 모든 제한 사항으로 인해 명령 프롬프트에서 사용하면 응용 프로그램에 영향을줍니다. 그러나 콘솔 응용 프로그램은 명령 프롬프트 창없이 다른 방법으로 사용할 수 있으며 유니 코드를 완벽하게 지원할 수 있습니다.

+0

@oofe 귀하의 답변에 감사드립니다. 그러나 아직 명확하지 않은 것은 거의 없습니다. 1. Windows 명령 프롬프트에 기본 코드 페이지가 있습니다. 현재 활성 코드 페이지는 chcp 명령을 실행하여 검색 할 수 있습니다. 동일한 명령을 사용하여 변경할 수 있습니다. 그것은 귀하의 의견에 따라 현재 사용되는 키보드 레이아웃과 아무 관련이 없습니다. 그렇다면 이것의 중요성은 무엇입니까?교차 시나리오에서의 행동은 무엇인지 확실하지 않습니다 : 중국어 kb 레이아웃 및 키릴 코드 페이지. –

+0

2. 유니 코드 사용 응용 프로그램의 경우 명령 프롬프트에서 인수를 사용하여 호출하면 명령 줄 인수가 Windows CRT에서 UTF-16으로 변환되고 wchar_t * argv []로 wmain()에 전달됩니다. 그게 맞습니까? 이것은 위 질문 3에서 의미하는 바입니다. –