我的非Unicode应用程序需要能够处理Unicode键盘输入(WM_CHAR /等),从而接收8位字符代码,然后在内部将其转换为Unicode。需要9x兼容性,因此不能使用大多数Unicode API。
目前它查看PRIMARYLANGID(GetKeyboardLayout(0))返回的语言,并在硬编码表中查找相关代码页。我找不到一个函数来获取特定语言或键盘布局使用的代码页。然后可以使用MultiByteToWideChar完成转换字符/字符串。
有没有办法获得当前键盘布局的代码页? GetACP返回默认的系统代码页,该页不受当前键盘布局的影响。
答案 0 :(得分:3)
这是另一种方法:
WORD languageID = LOWORD(GetKeyboardLayout(0));
char szLCData[6+1];
GetLocaleInfoA(MAKELCID(languageID, SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE,
szLCData, _countof(szLCData));
int codepage = atoi(szLCData);
答案 1 :(得分:3)
虽然这是一个旧线程,但我今天早上大部分时间都在寻找一种识别Windows 代码页的方法,给定一个特定的字符集 ID(当前键盘时) layout / locale未设置为该charset)。我认为示例代码可能对其他寻找类似信息的人有用。
在我的情况下,我想将一个字符集值(例如161(希腊语))映射到等效的Windows代码页1253.在挖掘批次后,我想出了以下内容:
/*
* 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;
}
希望这对其他人有用!
约翰
答案 2 :(得分:1)
我在需要在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是一个初始化为
的UNIT m_codePage = CP_ACP;
然后我在调用MultiByteToWideChar()时使用m___codePage来处理来自WM_CHAR等的键。