我需要将VB6应用程序的字符串输出转换为特定编码,但我不知道该字符串的编码。
问题在于,由于某些API函数的内部Unicode字符串会使用Windows的默认代码页转换为ANSI字符串,因此字符串输出的编码可能因系统而异,但我必须了解它才能执行转换。
我如何使用Win32 API或(如果没有其他方法)读取注册表来查找默认代码页?
我需要将VB6应用程序的字符串输出转换为特定编码,但我不知道该字符串的编码。
问题在于,由于某些API函数的内部Unicode字符串会使用Windows的默认代码页转换为ANSI字符串,因此字符串输出的编码可能因系统而异,但我必须了解它才能执行转换。
我如何使用Win32 API或(如果没有其他方法)读取注册表来查找默认代码页?
通过使用GetACP,可以更加简洁地返回默认代码页!(默认代码页通常称为“ANSI”)
int nCodePage = GetACP();
同时,许多API调用(例如MultiByteToWideChar
)接受常量值CP_ACP
(零),它始终表示“使用系统代码页”。因此,根据您希望执行的操作,您实际上可能不需要知道当前代码页。
GetSystemDefaultLCID() 可以获取系统区域设置。
如果 LCID 不足够,你确实需要代码页,请使用以下代码:
TCHAR szCodePage[10];
int cch= GetLocaleInfo(
GetSystemDefaultLCID(), // or any LCID you may be interested in
LOCALE_IDEFAULTANSICODEPAGE,
szCodePage,
countof(szCodePage));
nCodePage= cch>0 ? _ttoi(szCodePage) : 0;
int nCodePage=GetACP();
:) 获取代码页的名称,然后将其作为字符串获取,再转换为整数相当冗长。 - MarkJ这对我有用,谢谢,但可以更简洁地写成:
UINT nCodePage = CP_ACP;
const int cch = ::GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,
LOCALE_RETURN_NUMBER|LOCALE_IDEFAULTANSICODEPAGE,
(LPTSTR)&nCodePage, sizeof(nCodePage) / sizeof(_TCHAR) );
int nCodePage=GetACP();
:) 从名称获取代码页的名称,然后查找标识符代码有点冗长。 - MarkJ