利用Windows API如何获得友好的本地字符编码名称
我在写一个工具软件,需要以本地ANSI字符集输出一个xml文件,并用msxml解析。Unicode的版本已经解决了,就剩ANSI字符编码的版本了。我用以下方法在szCod...
我在写一个工具软件,需要以本地ANSI字符集输出一个xml文件,并用msxml解析。
Unicode的版本已经解决了,就剩ANSI字符编码的版本了。
我用以下方法在szCodePage得到类似936这样的字符串。
TCHAR szCodePage[10];
GetLocaleInfo(GetSystemDefaultLCID(),
LOCALE_IDEFAULTANSICODEPAGE,
szCodePage,sizeof(szCodePage)/sizeof(szCodePage[0]);
可惜msxml无法解析类似
<?xml version="1.0" encoding="windows-936" ?>
<?xml version="1.0" encoding="cp936" ?>
<?xml version="1.0" encoding=".936" ?>
这样的编码信息。
请教各位达人,如何从CP_ACP获得类似gb2312,gbk这样的字符串?
或者这个问题是否还有其他解法,例如以HTTP稳定的提供查询功能的网站,或其他可以利用的ActiveX\COM组件?
补充一下,输出文件必须是多字节编码的,我再强调一遍,输出Unicode字符的xml文件是一个,另外还需要一个多字节编码的输出文件。这2个都是需要的。
整个问题跟字符编码转换无关,所有不同字符编码之间的转换问题都已经被解决,唯一要解决的是提供一个msxml可以接受的字符编码名。
_______________
extern UINT cp; //想要获得友好名称的代码页,在别处获得,例如GetACP()
TCHAR charsetString[MAX_PATH] = _T(""); //友好名称被ssanf获取到这里
CPINFOEX info;
GetCPInfoEx(cp,0,&info);
assert(1 == _stscanf(info.CodePageName,
_T("%*d (ANSI/OEM - %*s %[a-zA-Z-]"),charsetString));
______________
以上这个方法是我能找到的唯一方法,对于常见的936,950,932都是有效的,但是对类似875,949是得不到正确的结果的。。
如果问题到了下个星期还没有人回答就直接完结吧。。 展开
Unicode的版本已经解决了,就剩ANSI字符编码的版本了。
我用以下方法在szCodePage得到类似936这样的字符串。
TCHAR szCodePage[10];
GetLocaleInfo(GetSystemDefaultLCID(),
LOCALE_IDEFAULTANSICODEPAGE,
szCodePage,sizeof(szCodePage)/sizeof(szCodePage[0]);
可惜msxml无法解析类似
<?xml version="1.0" encoding="windows-936" ?>
<?xml version="1.0" encoding="cp936" ?>
<?xml version="1.0" encoding=".936" ?>
这样的编码信息。
请教各位达人,如何从CP_ACP获得类似gb2312,gbk这样的字符串?
或者这个问题是否还有其他解法,例如以HTTP稳定的提供查询功能的网站,或其他可以利用的ActiveX\COM组件?
补充一下,输出文件必须是多字节编码的,我再强调一遍,输出Unicode字符的xml文件是一个,另外还需要一个多字节编码的输出文件。这2个都是需要的。
整个问题跟字符编码转换无关,所有不同字符编码之间的转换问题都已经被解决,唯一要解决的是提供一个msxml可以接受的字符编码名。
_______________
extern UINT cp; //想要获得友好名称的代码页,在别处获得,例如GetACP()
TCHAR charsetString[MAX_PATH] = _T(""); //友好名称被ssanf获取到这里
CPINFOEX info;
GetCPInfoEx(cp,0,&info);
assert(1 == _stscanf(info.CodePageName,
_T("%*d (ANSI/OEM - %*s %[a-zA-Z-]"),charsetString));
______________
以上这个方法是我能找到的唯一方法,对于常见的936,950,932都是有效的,但是对类似875,949是得不到正确的结果的。。
如果问题到了下个星期还没有人回答就直接完结吧。。 展开
2个回答
展开全部
既然Unicode版本可以解决,把ANSI字符转换成Unicode码再用解决Unicode版本的方法解决不就可以了么。
可以考虑用MultiByteToWideChar和WideCharToMultiByte函数进行两者的转换,详细用法可参考MSDN或http://blog.csdn.net/norains/article/details/1461174
可以考虑用MultiByteToWideChar和WideCharToMultiByte函数进行两者的转换,详细用法可参考MSDN或http://blog.csdn.net/norains/article/details/1461174
更多追问追答
追问
Unicode的版本已经解决了,就剩ANSI字符编码的版本了。意思是必须产生一个ANSI编码的文件。
追答
不知道你的具体应用环境,不过WinAPI函数MultiByteToWideChar是可以把ANSI字符转换成Unicode码字符的,仔细查阅MSDN,或我回答中提到的参考链接,研究研究就知道了,我明天上班,不能详谈了,抱歉。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
自己转
参考资料: http://msdn.microsoft.com/en-us/library/dd317756%28v=VS.85%29.aspx
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询