Windows上的字符转换之CP_ACP和CP_OEMCP
来源:互联网 发布:手机淘宝怎么代付不了 编辑:程序博客网 时间:2024/05/19 03:44
实际使用时的简单快速判断规则:
1、对于多字节编码的环境(泰文,日文,韩文,中文),CP_ACP与CP_OEMCP没有区别。
2、对于单字节编码的环境这两个代码页不同
1)对应的实际代码页不同,例如English-US的环境,ACP对应1252,OEMCP而437。
2)一个字节能表示的数值范围是(0-255),对于小于128的编码,437和1252对应的字符是一样的。
3)对于大于128的编码,是不一样的,有可能有些OEM字符(大于128的编码)在437中不存在,有些ASCII(大于128的编码)字符在1252中不存在。
4)相同的编码,对应的字符有可能不同。
5)同理,相同的字符对应的编码有可能不同。
3、windows的文件操作的API默认使用ASCII代码页(即CP_ACP),设备的操作的函数使用OEM代码页(即CP_OEMCP)。
结论: 如果与设备没有关系(即不读写设备)那么使用ACP,否则使用OEMCP(注意读写console的函数是对console设备的操作,所以默认使用OEMCP)。
文件读写API使用的代码页可以通过调用API来实现在CP_ACP与CP_OEMCP更替的。Console的操作也可以通过API来实现CP_ACP与CP_OEMCP更替的
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
下述程序代码片段用于测试
结果:
1. 输入是char str[]="我们中国"; UINTcodepage=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
- 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上的同步问题
- javascript的delete
- 在VMware上制作一个简单的Linux
- 进度条
- jsp两种注释区别,<%%>和<%!%>的区别
- jQuery弹出层始终垂直居中,相对于屏幕,相对于当前窗口
- Windows上的字符转换之CP_ACP和CP_OEMCP
- 初学者如何学习运维?
- hibernate ehcache 二级缓存
- 坚信每个人都能成为品牌
- 企业的人性和狼性
- 并查集的反思-----小希的迷宫与Is It a Tree?
- ORA-01591: lock held by in-doubt distributed transaction
- ddms:null java.lang.NullPointerException
- 《兵临城下》:360输在“斯大林格勒”?