如何使用c ++或调用winapi查找角色是否属于特定代码页

时间:2010-03-10 11:16:32

标签: c++ utf-8 codepages codepoint

我们如何找到角色是否属于特定代码页? 或者我们如何确定字符是否适合应用程序的当前活动IME。

4 个答案:

答案 0 :(得分:2)

使用WC_ERR_INVALID_CHARS标志,如果使用任何无效字符,WideCharToMultiByte将彻底失败。如果您想知道目标代码页中没有表示哪些字符,请使用lpDefaultChar和lpUsedDefaultChar参数。

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
  } 
}

答案 1 :(得分:2)

之前的两个答案已正确建议使用MultiByteToWideChar然后使用WideCharToMultiByte将您的UTF-8字符转换为UTF-16,然后转换为当前的Windows代码页(CP_ACP)。检查WideCharToMultiByte的结果以查看转换是否成功。

原始问题不清楚的是,你与印地语有特殊的问题。对于这种语言,你的问题毫无意义,因为没有印地语的Windows ANSI代码页,正如Chris Becke指出的那样。因此,您永远不能将印地语字符转换为CP_ACP,并且WideCharToMultiByte将始终失败。

要在Windows上使用印地语,据我所知,您必须是一个调用Unicode API的Unicode应用程序。

答案 2 :(得分:0)

使用Windows函数WideCharToMultiByte和MultiByteToWideChar,您可以在UTF-8和16位Unicode字符之间进行转换。这些函数具有指定代码页的参数,并在遇到无效字符时指定行为。

答案 3 :(得分:0)

谢谢Chris ..我正在运行以下代码

#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);   

}

上面的代码返回:

usedDefaultCharacters为英语? 0

日语使用的默认字符? 0

用于印地语的默认字符? 1

第三行不正确,因为印地语的代码页为0,并且传递的字符串由印地语字符组成,而且仍然将usedDefaultChar设置为1 ..这不应该是这种情况。