如何获取当前的键盘布局的代码页?(How to get the code page of the c

2019-09-24 04:21发布

我的非Unicode应用程序需要能够处理Unicode键盘输入(WM_CHAR /等),从而接收的8位字符代码,然后在内部将其转换为Unicode。 9X兼容性是必需的,所以用最统一的API是不是一种选择。

目前,它着眼于通过PRIMARYLANGID(GetKeyboardLayout(0))返回的语言,并查找相关的代码页中的硬编码表。 我找不到一个函数来获取由特定的语言或键盘布局中使用的代码页。 转换的字符/串然后可以做的MultiByteToWideChar。

有没有一种方法来获得当前的键盘布局的代码页? GetACP返回默认的系统代码页,不受当前的键盘布局。

Answer 1:

这里是另一种方式来做到这一点:

WORD languageID = LOWORD(GetKeyboardLayout(0));
char szLCData[6+1];
GetLocaleInfoA(MAKELCID(languageID, SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE,
               szLCData, _countof(szLCData));
int codepage = atoi(szLCData);


Answer 2:

虽然这是一个古老的线程,我只花了大部分今天上午的搜索识别赋予了特定的字符集 ID(如果当前的键盘布局/语言环境未设置为字符集)在Windows 代码页的方法。 我盘算了一下,示例代码可能会利用别人寻找类似的信息。

在我的情况,我想映射到等效的Windows代码页,1253字符集的值,如161(希腊) 很多挖的,我想出了以下后:

/*
 * Convert a font charset value (e.g. 161 - Greek) into a Windows codepage (1253 for Greek)
 */

UINT CodepageFromCharset(UINT nCharset)
{
    UINT nCodepage = CP_ACP;
    CHARSETINFO csi = {0};

    // Note, the symbol charset (2, CS_SYMBOL) translates to the symbol codepage (42, CP_SYMBOL).
    // However, this codepage does NOT produce valid character translations so the ANSI charset
    // (ANSI_CHARSET) is used instead. This appears to be a known problem.
    // See this discussion: "More than you ever wanted to know about CP_SYMBOL"
    // (http://www.siao2.com/2005/11/08/490495.aspx)

    if (nCharset == SYMBOL_CHARSET) nCharset = 0;
    DWORD* lpdw = (DWORD*)nCharset;

    // Non-zero return value indicates success...
    if (TranslateCharsetInfo(lpdw, &csi, TCI_SRCCHARSET) == 0)
    {
        // This should *not* happen but just in case make sure we use a valid default codepage.
    #ifdef _UNICODE
        csi.ciACP = 1200;
    #else
        csi.ciACP = CP_ACP;
    #endif
    }

    return csi.ciACP;
}

希望这是对别人有用!

约翰



Answer 3:

我已经在一个需要在Windows 9X运行的应用程序类似的问题。 我终于想出了解决的办法是听WM_INPUTLANGCHANGE通知邮件,当用户改变输入语言被发送到顶级窗口。 在我的消息过程我有这样的事情:

case WM_INPUTLANGCHANGE:
  {
    CHARSETINFO cs;
    if (TranslateCharsetInfo((DWORD*)wParam,&cs,TCI_SRCCHARSET))
      m_codePage = cs.ciACP;
    return DefWindowProc(WM_INPUTLANGCHANGE,wParam,lParam);
  }
  break;

其中m_codePage是初始化作为一个单元

  m_codePage = CP_ACP;

然后我用m___codePage在调用的MultiByteToWideChar()从WM_CHAR等处理键



文章来源: How to get the code page of the current keyboard layout?