Windows上的字符转换之CP_ACP和CP_OEMCP
来源:互联网 发布:网络设备监控软件 编辑:程序博客网 时间:2024/05/17 18:49
转载:http://blog.sina.com.cn/s/blog_53c1950a010158mw.html
Windows API函数MultiByteToWideChar用于多字节编码字符串向宽字符串(即UTF-16 LE)的转码。它的第一个参数的常用值是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文件)来把字符的形状写入显存。可以选择用哪种字形:如有衬线的Times NewRome,还是无衬线的Sans Serif。操作系统默认使用的字符集,就由微软来定义了,如English_US使用Codepage1252;简体中文使用Codepage936(即国标2312). 至于那个OEM436,就是legacy,用于向后兼容。
综上,就这么点事。CP_ACP和CP_OEMCP,分别是UINT的0和1。在WinNls.h中的注释说明分别是“default to ANSI code page”,“default to OEM
下述程序代码片段用于测试
结果:
1. 输入是char str[]="我们中国"; UINT codepage=936或者54936(这是GB18030代码页)或者CP_ACP或者CP_OEMCP,都能正确打印出结果“我们中国”。
2. 输入是char str[]="иい瓣";
3. 输入是char str[]="鎴戜滑涓浗 ";
附录:
一个在线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 是向后兼容的。所以编程角度把这三者视作等同,也凑合啦。
阅读全文
0 0
- Windows上的字符转换之CP_ACP和CP_OEMCP
- Windows上的字符转换之CP_ACP和CP_OEMCP
- Windows上的字符转换之CP_ACP和CP_OEMCP
- windows的CP_ACP代码页与CP_OEMCP代码页区别
- MultiByteToWideChar() Codepages CP_ACP/CP_OEMCP
- Windows上的字符转换
- C#之字符判断和大小写的转换
- ANSI字符和UNICODE字符的转换
- 字符和字符值的转换
- 字符和字符值之间的转换
- 字符 和 数值的转换
- windows下字符编码: UTF8 和 ANSI 的区别分析和转换
- windows字符编码转换
- C# 中的类型转换之字符串和字符数组之间的转换
- API入门系列之三 -那迷惑人的Windows字符和字符指针类型
- API入门系列之三 -那迷惑人的Windows字符和字符指针类型
- API入门系列之三 -那迷惑人的Windows字符和字符指针类型
- svn之在mac和windows上的同步问题
- 【Unity】Unity制作序列帧动画
- 嵌套if语句
- 机器学习实战笔记02
- The clean coder---读书笔记(一)
- 在web端使用Linq查询
- Windows上的字符转换之CP_ACP和CP_OEMCP
- Java学习笔记(3)
- Python-day15
- fall through C语言的一个失误
- linux开启端口或关闭端口(亲测有效)
- UDP协议发送数据:UDP协议接收数据:UDP协议收发数据注意事项
- 浏览器报Uncaught ReferenceError: require is not defined
- ImportantError:/usr/local/lib/python2.7/dist-packages/gnuradio/uhd/_uhd_swig.so:undefined symbol:_ZN
- switch语句