原文地址: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  code page”。所以,在简体中文Windows,这两个宏表示的都是代码页936.

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

UINT codepage=936;
    char str[]="我们中国"; //这个char[]必然是多字节编码字符串
    DWORD len;
    // 得到我们要转换的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[]="我们中国"; UINT codepage=936或者54936(这是GB18030代码页)或者CP_ACP或者CP_OEMCP,都能正确打印出结果“我们中国”。
2. 输入是char str[]="иい瓣";  UINT codepage=950; 也能正确把上述大五码字符串打印出宽字符串输出结果“我们中国”。
3. 输入是char str[]="鎴戜滑涓浗 ";  UINT codepage=65001; 也能正确把上述UTF-8字符串打印出宽字符串输出结果“我们中国”。

附录:
一个在线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 是向后兼容的。所以编程角度把这三者视作等同,也凑合啦。

转载于:https://www.cnblogs.com/time-is-life/p/9532080.html

Windows上的字符转换之CP_ACP和CP_OEMCP相关推荐

  1. linux cp acp,Windows上的字符转换之CP_ACP和CP_OEMCP

    Windows API函数MultiByteToWideChar用于多字节编码字符串向宽字符串(即UTF-16 LE)的转码.它的第一个参数的常用值是CP_ACP和CP_OEMCP.这到底指的是什么代 ...

  2. windows上UTF8和GBK互相转换

    windows上UTF8和GBK互相转换 static std::string UTF8ToGBK(const std::string& strUTF8) {int len = MultiBy ...

  3. 在 Mac 上通过“启动转换助理”安装 Windows 10

    您可以通过"启动转换"在 Mac 上安装 Microsoft Windows 10,然后在重新启动 Mac 时在 macOS 和 Windows 之间进行切换. 在 Mac 上安装 ...

  4. c语言输出字符的十六进制,用c语言输入键盘上的字符后转换成十六进制输出

    用c语言输入键盘上的字符后转换成十六进制输出 悬赏分:10 | 提问时间:2010-9-13 10:26 | 提问者:745922085 | 问题为何被关闭 其他回答 共3条 #include #in ...

  5. 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换...

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  6. mbstowcs 和 wcstombs函数:C语言提供的宽字符和多字节字符转换函数

    C语言中的多字节字符与宽字符 字符型char只占八位,存储ascii码的,而宽字符型是为了存储多国语言的代码unicode,包括中文,法语德语什么的,8位256种不够用了 C语言原本是在英文环境中设计 ...

  7. 写一个Windows上的守护进程(4)日志其余

    写一个Windows上的守护进程(4)日志其余 这次把和日志相关的其他东西一并说了. 一.vaformat C++日志接口通常有两种形式:流输入形式,printf形式. 我采用printf形式,因为流 ...

  8. WINDOWS上传文件到LINUX中文乱码

    现象:WINDOWS上传文件到LINUX后,中文文件名乱码,中文内容乱码 解决:首先考虑到的应该是字符编码不一致导致,其次再看是否没安装中文包 1:检查是否安装convmv工具 [oracle@res ...

  9. C++ 宽、窄字符转换

    目录 locale setlocale函数 设置字符编码 单字符宽字符互相转换 mbstowcs函数 wcstombs函数 mbtowc函数 wctomb函数 宽.窄字符转换总结 查看本文前先弄清字符 ...

最新文章

  1. IAAS、SAAS、PAAS
  2. 【编程】char unsigned int float double long 字节数
  3. android开发之EditText默认hint字体大小
  4. C语言中字符型和浮点型能否相加,C语言中数据结构的基本类型(整型、浮点型和字符型)...
  5. C#求一元二次方程的根经典案例程序
  6. 数据库抽象类PDOStatement对象使用
  7. Java读取Excel文件
  8. 业务逻辑 : forex mlm
  9. 1.6编程基础之一维数组_01与指定数字相同的数的个数
  10. 苹果CMS小俊XG013主题模板
  11. Java文件流的原理与应用
  12. php laravel 空白,php – Laravel View Make返回空白页面
  13. Kwort Linux 3.5 RC1 发布
  14. (九)洞悉linux下的Netfilteriptables:网络地址转换原理之DNAT
  15. java map格式化_字符串模板格式化输出map 值
  16. 使用phpQuery 抓取HTML 页面内容
  17. QTableview
  18. 安装 Eyoucms
  19. access统计班级人数_使用ACCESS查询统计分数段人数
  20. 2022-2028年中国农产品期货市场投资分析及前景预测报告

热门文章

  1. C程序设计实现高内聚低耦合
  2. 2019 江苏(盛泽)纤维及纱线展会开展在即
  3. t3计算机修改名称后无法登录,安装用友通T3时提示“计算机名称不符”?
  4. 排队论mm1和mms
  5. 批量删除PDF中的高亮和划线
  6. BlueTooth: 嵌入式蓝牙网关中蓝牙驱动层研究与实现
  7. c语言程序设计哈工大第五周,C语言程序设计_哈工大(5):数组.pdf
  8. 当前在线教育行业的市场是怎样的,如何细分,各有何特点?
  9. 等保等级具体分为几级?如何划分?
  10. 快递100物流查询插件免费开放啦