これは古いスレッドですが、特定の文字セットID(現在のキーボードレイアウト/ロケールがその文字セットに設定されていない場合)を指定してWindowsコードページを識別する方法を探すために今朝のほとんどを費やしました。サンプルコードは、同様の情報を探している他の人に役立つかもしれないと思いました。
私の場合、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;
}
これが他の人にも役立つことを願っています!
ジョン