【发布时间】:2009-05-26 10:06:07
【问题描述】:
我必须将 VB6 应用程序的字符串输出的编码转换为特定的编码。
问题是,我不知道字符串的编码,因为:
根据 VB6 文档,当访问某些 API 函数时,内部 Unicode 字符串会使用 Windows 的默认代码页转换为 ANSI 字符串。
因此,字符串输出的编码在不同的系统上可能不同,但我必须知道它才能执行转换。
如何使用 Win32 API 或 - 如果没有其他方法 - 通过读取注册表来读取默认代码页?
【问题讨论】:
我必须将 VB6 应用程序的字符串输出的编码转换为特定的编码。
问题是,我不知道字符串的编码,因为:
根据 VB6 文档,当访问某些 API 函数时,内部 Unicode 字符串会使用 Windows 的默认代码页转换为 ANSI 字符串。
因此,字符串输出的编码在不同的系统上可能不同,但我必须知道它才能执行转换。
如何使用 Win32 API 或 - 如果没有其他方法 - 通过读取注册表来读取默认代码页?
【问题讨论】:
使用GetACP 可以更简洁——用于返回默认代码页的 Win32 API 调用! (默认代码页通常称为“ANSI”)
int nCodePage = GetACP();
还有许多 API 调用(例如 MultiByteToWideChar)接受常量值 CP_ACP(零),始终为 means "use the system code page"。因此,您实际上可能不需要知道当前的代码页,这取决于您想用它做什么。
【讨论】:
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(); :) 获取代码页的名称,然后将代码页作为字符串获取,然后转换为整数是相当冗长的
这对我有用,谢谢,但可以更简洁地写成:
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(); :) 获取代码页的 name 然后查找标识符有点冗长名称中的代码