2010-03-10 6 views
1

문자가 특정 코드 페이지에 속하는지 어떻게 알 수 있습니까? 또는 charcter가 응용 프로그램의 현재 활성 IME에 맞는지 여부를 어떻게 결정할 수 있습니까?C++을 사용하거나 winapi를 호출하여 특정 코드 페이지에 속하는 문자를 찾는 방법

+1

'문자'를 정의해야합니다. UTF-16 또는 UTF-8 멀티 바이트 문자가 있다는 의미입니까? 주어진 Windows 코드 페이지의 점으로 변환되는지 알고 싶습니까? – richb

+0

맞습니다. 문자는 UTF-8 문자가 될 수 있으며 제공된 Windows 코드 페이지의 codepoint로 변환되는지 알아야합니다. – Prakash

답변

0

Windows 함수 WideCharToMultiByte 및 MultiByteToWideChar를 사용하면 UTF-8 및 16 비트 유니 코드 문자간에 변환 할 수 있습니다. 함수에는 코드 페이지를 지정하고 유효하지 않은 문자가있는 경우 동작을 지정하는 인수가 있습니다.

+0

고마워요, 네 말이 맞아, 나는 WideCharToMultiByte()의 LPBOOL lpUsedDefaultChar 매개 변수를 사용하여 코드 페이지가 0 인 힌디어 IME에 대해 동일한 결과를 얻었지만 lpUsedDefaultChar는 항상 true입니다. [내 세부 정보가 어떻게 제거되었는지 잘 모르겠다. (그러나 내가 거기에서 자세히 언급했다.] – Prakash

1
  • 첫째, UTF-16 이제 MultiByteToWideChar
  • 사용하는 문자의 당신의 UTF-8 문자열로 변환, 첫 번째 매개 변수로 원하는 코드 페이지를 통과 WideCharToMultiByte를 사용하여 프로세스를 역.

잘못된 문자가 사용되면 WC_ERR_INVALID_CHARS 플래그를 사용하고 WideCharToMultiByte가 완전히 실패합니다. 대상 코드 페이지에 표시되지 않는 문자를 알고 싶다면 lpDefaultChar 및 lpUsedDefaultChar 매개 변수를 사용하십시오. 영어

usedDefaultCharacters :

LPCWSTR pszUtf16; // converted from utf8 source character 
UINT nTargetCP = CP_ACP; 
BOOL fBadCharacter = FALSE; 
if(WideCharToMultiByte(nTargetCP,WC_NO_BEST_FIT_CHARS,pszUtf16,NULL,0,NULL,&fBadCharacter) 
{ 
    if(fBadCharacter) 
    { 
    // at least one character in the string was not represented in nTargetCP 
    } 
} 
+0

Chris. .. 일부 코드를 추가 할 수 있도록 대답으로 내 의견을 게시했습니다. – Prakash

0

감사 Chris..I 다음 코드를

#define CP_HINDI 0 
#define CP_JAPANESE 932 
#define CP_ENGLISH 1252 

wchar_t wcsStringJapanese = 'あ'; 
wchar_t wcsStringHindi = 'र'; 
wchar_t wcsStringEnglish = 'A'; 

int main() 
{ 

    BOOL usedDefaultCharacter = FALSE; 

    /* Test for ENGLISH */ 
    WideCharToMultiByte(CP_ENGLISH, 
         0, &wcsStringEnglish, 
         -1, 
         NULL, 
         0, 
         NULL, 
         &usedDefaultCharacter); 
    printf("usedDefaultCharacters for English? %d \n",usedDefaultCharacter); 

    usedDefaultCharacter = FALSE; 

    /*TEST FOR JAPANESE */ 

    WideCharToMultiByte(CP_JAPANESE, 
         0, 
         &wcsStringJapanese, 
         -1, 
         NULL, 
         0, 
         NULL, 
         &usedDefaultCharacter); 
    printf("usedDefaultCharacters for Japanese? %d \n",usedDefaultCharacter); 

    //TEST FOR HINDI 
    usedDefaultCharacter = FALSE; 

    WideCharToMultiByte(CP_HINDI, 
         0, 
         &wcsStringHindi, 
         -1, 
         NULL, 
         0, 
         NULL, 
         &usedDefaultCharacter); 
    printf("usedDefaultCharacters for Hindi? %d \n",usedDefaultCharacter); 

} 

위의 코드 반환을 실행하고? 0

usedDefaultCharacters for Japanese? 0

힌디어에 대한 기본 문자는 사용 하시겠습니까? 1

힌디어 코드 페이지가 0이고 전달 된 문자열이 힌디어 문자로 구성되어 있고 usedDefaultChar가 1로 설정되어 있기 때문에 세 번째 줄이 잘못되었습니다.

+0

힌디어의 코드 페이지는 0이 아닙니다.힌디어는 새로운 '유니 코드 전용'현지화 중 하나입니다. 힌디어 문자를 나타내는 실제 Windows ansi 코드 페이지는 없습니다. 이 페이지를 참조하십시오 : http://msdn.microsoft.com/en-us/goglobal/bb688174.aspx –

+0

WideCharToMultiByte의 "codepage"매개 변수에 제공 할 수있는 값이 있습니까? 인코딩은 힌디어 문자를 지원합니까? 또는 (C++에서) 페이지의 현재 인코딩이 UNICODE 인 경우 무엇을 찾을 수 있습니까? - 고맙습니다. – Prakash

1

이전의 두 가지 대답은 MultiByteToWideChar와 WideCharToMultiByte를 사용하여 UTF-8 문자를 UTF-16으로 변환 한 다음 현재 Windows 코드 페이지 (CP_ACP)로 올바르게 제안했습니다. WideCharToMultiByte의 결과를 확인하여 변환이 성공했는지 확인하십시오.

원래 질문에서 분명하지 않은 점은 힌디어와 관련하여 특별한 문제가 있다는 것입니다. Chris Becke가 지적한 것처럼 힌디어 용 Windows ANSI 코드 페이지가 없기 때문에이 언어의 경우 질문은 의미가 없습니다. 따라서 힌디어 문자를 절대로 CP_ACP로 변환 할 수 없으며 WideCharToMultiByte는 항상 실패합니다.

Windows에서 힌디어를 사용하려면 이해하는 한 유니 코드 API를 호출하는 유니 코드 앱이어야합니다.