문제

나는 새로운 윈도우 프로그래밍을 읽은 후 Petzold 책 궁금:

그것은 여전히 사용하는 것이 좋습 TCHAR 유형 _T() 함을 선언하는 문자열 또는해야하는 경우 사용 wchar_tL"" 문자열에서 새로운드?

나는 것만 대상으로 윈도우 2000 및 내 코드 i18n 에서 시작합니다.

도움이 되었습니까?

해결책

오늘 새 프로젝트를 수행 한 경우에도 여전히 TCHA 구문을 사용할 것입니다. 사용과 WCHAR 구문 사이에는 실질적인 차이가 없으며 문자 유형이 무엇인지 명시적인 코드를 선호합니다. 대부분의 API 기능 및 도우미 객체는 TCHA 유형 (예 : CSTRING)을 사용/사용하기 때문에 사용하는 것이 합리적입니다. 또한 어느 시점에서 ASCII 앱에서 코드를 사용하기로 결정하거나 Windows가 Unicode32 등으로 진화하는 경우 유연성을 제공합니다.

당신이 WCHAR 경로로 가기로 결정했다면, 나는 그것에 대해 명백 할 것입니다. 즉, cstring 대신 cstringw를 사용하고 tchar (예 : CW2CT)로 변환 할 때 매크로를 주조하십시오.

어쨌든 내 의견입니다.

다른 팁

짧은 대답 : 아니.

다른 모든 사람들이 이미 쓴 것처럼 많은 프로그래머는 여전히 TCHARS와 해당 기능을 사용합니다. 내 소견에 전체 개념은 나쁜 생각이었습니다. UTF-16 문자열 처리는 간단한 ASCII/MBCS 문자열 처리와 매우 다릅니다. 동일한 알고리즘/기능을 두 가지 모두와 함께 사용하는 경우 (TCHA 아이디어가 기반을 둔 것입니다!) 간단한 문자열 연결보다 조금 더 많이 수행하는 경우 UTF-16 버전에서 매우 나쁜 성능을 얻을 수 있습니다. 구문 분석 등). 주된 이유는 대리.

당신이있을 때 유일한 예외를 가지고 있습니다 진짜 유니 코드를 지원하지 않는 시스템에 대한 응용 프로그램을 컴파일해야합니다. 새로운 응용 프로그램에서 과거 에서이 수하물을 사용할 이유가 없습니다.

Sascha에 동의해야합니다. 기본 전제 TCHAR / _T() / 등은 "ANSI"기반 응용 프로그램을 작성한 다음 매크로를 정의하여 마술처럼 유니 코드 지원을 제공 할 수 있다는 것입니다. 그러나 이것은 몇 가지 나쁜 가정을 기반으로합니다.

MBC와 유니 코드 버전의 소프트웨어를 적극적으로 구축합니다.

그렇지 않으면, 당신 ~ 할 것이다 미끄러 져 평범한 사용 char* 많은 곳에서 끈.

_T ( "...") 리터럴에서 비 ASCII Backslash Escapes를 사용하지 않는다는

"ANSI"인코딩이 ISO-8859-1이 아니라면 결과 char* 그리고 wchar_t* 리터럴은 같은 문자를 나타내지 않습니다.

UTF-16 문자열은 "ansi"줄처럼 사용됩니다.

그들은 아니야. 유니 코드는 대부분의 레거시 문자 인코딩에 존재하지 않는 몇 가지 개념을 소개합니다. 대리. 캐릭터 결합. 표준화. 조건부 및 언어에 민감한 케이스 규칙.

아마도 가장 중요한 것은 UTF-16이 디스크에 거의 저장되지 않았거나 인터넷을 통해 전송되지 않는다는 사실은 외부 표현에 선호되는 경향이 있습니다.

응용 프로그램이 인터넷을 사용하지 않음

(이제 이것은 유효한 가정 일 수 있습니다. 당신의 소프트웨어이지만 ...)

웹은 UTF-8에서 실행됩니다 그리고 더 희귀 한 인코딩의 과다. 그만큼 TCHAR 개념은 두 가지만 인식합니다 : "ansi"( 캔트 UTF-8이어야합니다) 및 "유니 코드"(UTF-16). Windows API가 유니 코드 인식을 부르는 데 유용 할 수 있지만 웹 및 전자 메일 앱을 유니 코드 인식으로 만드는 것은 쓸모가 없습니다.

비 마이크로 소프트 라이브러리를 사용하지 않습니다

아무도 사용하지 않습니다 TCHAR. 포코 용도 std::string 및 UTF-8. sqlite API의 UTF-8 및 UTF-16 버전이 있지만 TCHAR. TCHAR 표준 라이브러리에도 있지 않으므로 아니요 std::tcout 직접 정의하고 싶지 않다면.

TCHA 대신 추천하는 것

유효한 UTF-8이 아닌 파일을 읽어야 할 때를 제외하고 "ANSI"인코딩이 존재한다는 것을 잊어 버리십시오. 잊어 버려 TCHAR 도. Windows API 기능의 "W"버전을 항상 호출하십시오. #define _UNICODE 실수로 "a"함수를 호출하지 않도록하기 위해.

문자열 : UTF-8에 항상 UTF 인코딩을 사용하십시오 char 문자열 및 UTF-16 (Windows) 또는 UTF-32 (UNIX- 유사 시스템) wchar_t 문자열. typedef UTF16 그리고 UTF32 플랫폼 차이를 피하기위한 문자 유형.

만약 당신이 궁금하는 경우 그것은 여전히 연습,그때 그렇습니다-그것은 아직도 사용됩니다.아무도 볼 것이 당신의 코드의 재 사용하는 경우 TCHAR 및 _T("").프로젝트에서 일하고 있어요 지금은에서 변환하는 ANSI 유니코드-우리는 것 휴대용(TCHAR)노선입니다.

그러나...

내 투표하는 것을 잊지 모든 ANSI/UNICODE 휴대용 매크로(TCHAR,_T(""),그리고 모든 _tXXXXXX 전화 등)및 가정 unicode 다.나는 정말 없는 지점의 휴대용되는 경우 당신은 필요가 없는 ANSI 버전입니다.내가 사용하는 것이 모두 와이드 문자를 기능과 형식을 직접 있습니다.Preprend 모든 끈으로 L.

그만큼 Windows 프로그래밍 기사 소개 MSDN에서 말합니다

새로운 응용 프로그램은 항상 API의 유니 코드 버전을 호출해야합니다.

그만큼 텍스트 그리고 TCHAR 모든 응용 프로그램은 유니 코드를 사용해야하기 때문에 오늘날 매크로는 덜 유용합니다.

나는 고집 할 것이다 wchar_t 그리고 L"".

다른 접근법 (둘 중 어느 것도) 제안하고 싶습니다.

요약하려면 UTF-8 인코딩을 가정하고 char* 및 std :: string을 사용하고 API 기능을 감싸는 경우에만 UTF-16으로 변환합니다.

Windows 프로그램 에서이 접근법에 대한 자세한 정보와 정당화는 http://www.utf8everywhere.org.

TCHAR/WCHAR 할 수 있는 충분한 기존 프로젝트입니다.하지만 새로운 애플리케이션들을 위해,나는 말 NO.

이러한 모든 TCHAR/WCHAR 물건이 있기 때문에 역사적인 이유입니다. TCHAR 제공하는 맞 신 깔끔한 방법(변)스위치 ANSI 텍스트 인코딩(룹)와 유니코드 문자 인코딩(UTF-16).과거에는,지 않은 사람들의 이해의 수자의 모든 언어로에서 세계입니다.그들은 가정 2 바이트이 충분한 모든 문자를 나타내고,따라서는 길이가 고정된 문자 인코딩을 사용하여 계획 WCHAR.그러나,이것은 더 이상 참 릴리스 이후의 유니코드에 2.0 1996.

는 말을하는 것입니다:에 상관없이 당신에 사용하기 CHAR/WCHAR/TCHAR, 텍스트 처리 부분에서 당신의 프로그램을 처리할 수 있어야 합니다 가변 길이의 캐릭터 국제화.

그래서 당신은 실제로 할 필요가 더 이상 선택에서 하나 CHAR/WCHAR/TCHAR 을 위한 프로그래밍 창:

  1. 는 경우 응용 프로그램이 작은 포함하지 않는 텍스트 처리(예:그냥 주위에 통과하는 텍스트 문자열로 인수)다음으로 스틱 WCHAR.이후 그것은 쉽게 이와 함께 작동하는 방법 WinAPI 유니코드 지원합니다.
  2. 그렇지 않으면 좋은 UTF-8 을 사용하여 내부로 인코딩 및 저장소 텍스트 문자열 또는 std::string.고 그들에게 은밀한 UTF-16 호출할 때 WinAPI. UTF-8 지금 지배적인 엔코딩의 많은 편리한 라이브러리와 툴 프로세스 UTF-8strings.

이 멋진 웹사이트에 대한 좀 더 깊이 읽기:http://utf8everywhere.org/

네 그럼요; 적어도 _t 매크로. 그래도 넓은 문자에 대해서는 확실하지 않습니다.

그 이유는 Wince 또는 기타 비표준 Windows 플랫폼을 더 잘 지원하는 것입니다. 코드가 NT에 남아 있다고 100% 확신한다면, 정기적 인 C- 스트링 선언을 사용할 수 있습니다. 그러나 수천 줄의 코드를 통과하고 일부 라이브러리를 포트 해야하는 경우 어디에나 추가하는 것과 비교할 때 비 독사 플랫폼에서 매크로를 멀리 떨어 뜨리는 것이 훨씬 쉽기 때문에보다 유연한 접근 방식을 향한 경향이 가장 좋습니다. Windows Mobile에.

IMHO, 코드에 TCHARS가 있다면 잘못된 수준의 추상화로 작업하고 있습니다.

사용 무엇이든 문자열 유형은 텍스트 처리를 처리 할 때 가장 편리합니다. 이것은 유니 코드를 지원하는 것이되기를 바랍니다. 그러나 그것은 당신에게 달려 있습니다. 필요에 따라 OS API 경계에서 변환하십시오.

파일 경로를 다룰 때 문자열을 사용하는 대신 자신의 사용자 정의 유형을 채찍질하십시오. 이렇게하면 OS 독립 경로 분리기가 가능하며 수동 문자열 연결 및 분할보다 코드에 대한 더 쉬운 인터페이스를 제공하며 다른 OS (ANSI, UCS-2, UTF-8 등)에 훨씬 쉽게 적응할 수 있습니다. .

명시 적 WCHAR 이외의 다른 것을 사용하는 유일한 이유는 이식성과 효율성입니다.

최종 실행 파일을 가능한 한 작게 만들고 싶다면 Char를 사용하십시오.

RAM 사용에 관심이없고 국제화가 간단한 번역만큼 쉬워지기를 원한다면 WCHAR을 사용하십시오.

코드를 유연하게 만들려면 tchar를 사용하십시오.

라틴 문자 만 사용하려는 경우 ASCII/MBCS 문자열을 사용하여 사용자에게 RAM이 필요하지 않도록 할 수도 있습니다.

"시작부터 i18n"인 사람들의 경우 소스 코드 공간을 저장하고 모든 유니 코드 기능을 사용하십시오.

오래된 질문에 추가 :

아니

VS2010에서 새로운 CLR C ++ 프로젝트를 시작하십시오. Microsoft 자체는 사용합니다 L"Hello World", '그런가 말했다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top