Windows上的字符转换之CP_ACP和CP_OEMCP windows cp

Windows API函数MultiByteToWideChar用于多字节编码字符串向宽字符串(即UTF-16LE)的转码。它的第一个参数的常用值是CP_ACP和CP_OEMCP。这到底指的是什么代码页呢? 我编了小程序做了实验。

CP_ACP和CP_OEMCP,分别是指当前计算机上的Windows操作系统的Windows代码页与OEM代码页。对于东亚的简体中文、繁体中文、日文、韩文等Win操作系统语言环境,这两种代码页是同一个,如简体中文是代码页936即GB2312字符集,繁体中文是950即大五码字符集,韩文是949、日文是932。对于西方国家的拼音文字语言设置,两个代码页不同。典型的如English_US,其Windows代码页是1252、OEM代码页是437,还有第三个代码页ISO-8859-1又称Latin-1或“西欧语言”,是针对英语法语西语德语等西欧语言的扩展ASCII字符集。这三者(1252、437、8859-1)都是针对英语但并不相同。

为什么会有Windows代码页与OEM代码页的区别呢?因为在八十年代DOS系统时期,还是“字符终端”的屏幕只能够显示的256个字符,这些字符的字形的点阵信息存储在硬件的ROM中。DOS操作系统通过系统中断调用驱动程序把这些字形读出来写入显存。这是由OEM负责字符集中有哪些字符,显示时为什么字形的时代,而且一台PC上只有这么一套字符集/字形,没得选,除非你再差一个带字库的“汉卡”。进入了微软的Windows操作系统时代之后,由于硬件的发展,操作系统有了自己的字形文件,绘制字符时不再真地去读ROM,而是用字形文件(就是字体fonts文件)来把字符的形状写入显存。可以选择用哪种字形:如有衬线的TimesNewRome,还是无衬线的SansSerif。操作系统默认使用的字符集,就由微软来定义了,如English_US使用Codepage1252;简体中文使用Codepage936(即国标2312).至于那个OEM436,就是legacy,用于向后兼容。

综上,就这么点事。CP_ACP和CP_OEMCP,分别是UINT的0和1。在WinNls.h中的注释说明分别是“default toANSI code page”,“default to OEM codepage”。所以,在简体中文Windows,这两个宏表示的都是代码页936.

下述程序代码片段用于测试


UINTcodepage=936;
charstr[]="我们中国"; //这个char[]必然是多字节编码字符串
DWORDlen;
//得到我们要转换的MyString为UNICODE所需要的UNICODE缓冲区的长度
len =MultiByteToWideChar(codepage, 0, str, -1, 0, 0);
wchar_t*buf=new wchar_t[len+10];
MultiByteToWideChar(codepage, 0, str, -1, buf,len);

setlocale(LC_CTYPE,"");//把当前locale字符环境从C/C++缺省的"C"设置,改为操作系统的设置(即代码页936)
wprintf(L"%s",buf);//因为这个C标准库函数的实现,是把宽字符输入又转化为多字节字符去显示,所以必须正确设置当前操作系统的多字节编码的代码页

结果:
1. 输入是--char str[]="我们中国"; UINTcodepage=936或者54936(这是GB18030代码页)或者CP_ACP或者CP_OEMCP,都能正确打印出结果“我们中国”。
2. 输入是char str[]="иい瓣"; UINT codepage=950;也能正确把上述大五码字符串打印出宽字符串输出结果“我们中国”。
3. 输入是char str[]="鎴戜滑涓浗 "; UINT codepage=65001;也能正确把上述UTF-8字符串打印出宽字符串输出结果“我们中国”。

Windows上的字符转换之CP_ACP和CP_OEMCP windows cp
附录:
一个在线GB/BIG5/UTF-8/UNICODE转码的网站http://www.dheart.net/bmzh/index.php

ps.实际上,简体中文Windows系统的默认代码页936,不是只有6763个汉字的GB2316,正确说法是自1995年Windows95起,代码页936是GBK字符集,包含了20902个汉字。此前,代码页936与GB2316是一样的。GB2316>> GBK >> GB18030 是向后兼容的。所以编程角度把这三者视作等同,也凑合啦。


  

爱华网本文地址 » http://www.aihuau.com/a/25101016/320403.html

更多阅读

如何将文章当中的全角字符转换成半角字符 日语全角半角转换

如何将文章当中的全角字符转换成半角字符——简介经常打字的朋友可能碰到过这样的情况,不小心将输入法中的半角符号切换到了全角符号,于是打出来的字符都是间距特别大,显得很难看,怎么办?下面小编给大家分享:如何将文章当中的全角字符转换

世界上有10种人,懂二进制和不懂二进制的 二进制转换10进制

昨晚是捧着手机,看着豆瓣上的笑话,流着眼泪睡的。我是一个笑点低的人,奇低。讲笑话给别人听的时候,往往是自己边讲边笑,然后周围的人不知所云。同样笑点低的还有亲爱的乖仔,永远一副笑不够的样子。所以说,分享一个很喜欢的笑话一定要选

妇人之仁 妇人之仁和善良的区别

周末无事,闲来说点时政。在对待难民的问题上德国总理默克尔一开始就犯了一个错误,典型的妇人之仁。首先,德国是率先公开表态愿意接受难民的国家,这种在他人处于为难之时肯伸出双手的做法无疑是值得赞许和肯定的,而无论这样做的目的是什么

中国历史上百位将领之29 --- 关羽 (汉寿亭侯) 汉寿亭侯是多大的官

中国历史上百位将领之 ---关羽关羽(162年-220年),字云长,本字长生,司隶河东解人(今山西省运城市),约生于东汉桓帝延熹年间,东汉末年三国时期刘备的重要将领。关羽最为特殊之处是其倍受中华文化历代推崇,由于其忠义和勇武的形象,多被民众尊称为关

声明:《Windows上的字符转换之CP_ACP和CP_OEMCP windows cp》为网友花尖上的泪滴分享!如侵犯到您的合法权益请联系我们删除