문자가 특정 코드 페이지에 속하는지 어떻게 알 수 있습니까? 또는 charcter가 응용 프로그램의 현재 활성 IME에 맞는지 여부를 어떻게 결정할 수 있습니까?C++을 사용하거나 winapi를 호출하여 특정 코드 페이지에 속하는 문자를 찾는 방법
답변
Windows 함수 WideCharToMultiByte 및 MultiByteToWideChar를 사용하면 UTF-8 및 16 비트 유니 코드 문자간에 변환 할 수 있습니다. 함수에는 코드 페이지를 지정하고 유효하지 않은 문자가있는 경우 동작을 지정하는 인수가 있습니다.
고마워요, 네 말이 맞아, 나는 WideCharToMultiByte()의 LPBOOL lpUsedDefaultChar 매개 변수를 사용하여 코드 페이지가 0 인 힌디어 IME에 대해 동일한 결과를 얻었지만 lpUsedDefaultChar는 항상 true입니다. [내 세부 정보가 어떻게 제거되었는지 잘 모르겠다. (그러나 내가 거기에서 자세히 언급했다.] – Prakash
- 첫째, 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
}
}
Chris. .. 일부 코드를 추가 할 수 있도록 대답으로 내 의견을 게시했습니다. – Prakash
감사 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이 아닙니다.힌디어는 새로운 '유니 코드 전용'현지화 중 하나입니다. 힌디어 문자를 나타내는 실제 Windows ansi 코드 페이지는 없습니다. 이 페이지를 참조하십시오 : http://msdn.microsoft.com/en-us/goglobal/bb688174.aspx –
WideCharToMultiByte의 "codepage"매개 변수에 제공 할 수있는 값이 있습니까? 인코딩은 힌디어 문자를 지원합니까? 또는 (C++에서) 페이지의 현재 인코딩이 UNICODE 인 경우 무엇을 찾을 수 있습니까? - 고맙습니다. – Prakash
이전의 두 가지 대답은 MultiByteToWideChar와 WideCharToMultiByte를 사용하여 UTF-8 문자를 UTF-16으로 변환 한 다음 현재 Windows 코드 페이지 (CP_ACP)로 올바르게 제안했습니다. WideCharToMultiByte의 결과를 확인하여 변환이 성공했는지 확인하십시오.
원래 질문에서 분명하지 않은 점은 힌디어와 관련하여 특별한 문제가 있다는 것입니다. Chris Becke가 지적한 것처럼 힌디어 용 Windows ANSI 코드 페이지가 없기 때문에이 언어의 경우 질문은 의미가 없습니다. 따라서 힌디어 문자를 절대로 CP_ACP로 변환 할 수 없으며 WideCharToMultiByte는 항상 실패합니다.
Windows에서 힌디어를 사용하려면 이해하는 한 유니 코드 API를 호출하는 유니 코드 앱이어야합니다.
'문자'를 정의해야합니다. UTF-16 또는 UTF-8 멀티 바이트 문자가 있다는 의미입니까? 주어진 Windows 코드 페이지의 점으로 변환되는지 알고 싶습니까? – richb
맞습니다. 문자는 UTF-8 문자가 될 수 있으며 제공된 Windows 코드 페이지의 codepoint로 변환되는지 알아야합니다. – Prakash