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

linux cp acp,Windows上的字符转换之CP_ACP和CP_OEMCP相关推荐

  1. Windows上的字符转换之CP_ACP和CP_OEMCP

    原文地址:http://blog.sina.com.cn/s/blog_53c1950a010158mw.html Windows API函数MultiByteToWideChar用于多字节编码字符串 ...

  2. linux 类似winscp_mac如何连接远程linux,类似windows上的putty和winscp

    windows上有putty可以通过ssh协议连接远程linux系统. mac上也可以用终端连接,转自:http://www.unixnewbie.org/putty-equivalent-for-m ...

  3. linux下挂载windows上的共享目录,并设置所有者为非root用户

    参考了很多文章,这里总结下我得出来的最优答案(针对我的需求而言)吧,但是还是存在bug,稍后指出! 以下是我的bash脚本,防止多次重复挂载,相信看了就能明白: [zcm@vm-fedora20 sh ...

  4. samb连接linux服务器,在Windows上访问Linux下的Samba服务器的方法

    首先先记录下在linux客户端怎么用命令访问windows或者linux的共享文件夹 第一步 复制代码代码如下: smbclient -L //192.168.100.5 -U wujie (smbc ...

  5. python在windows 比linux 慢,为什么Windows上的python套接字扫描比在linux上慢很多?

    我试过在网上搜索不同的python文档,论坛和其他人的问题,但我还没有找到任何人有这个相同的问题.为什么Windows上的python套接字扫描比在linux上慢很多? 我的脚本的典型样子是我将创建一 ...

  6. 【正点原子I.MX6U-MINI应用篇】6、嵌入式Linux在LCD屏幕上显示字符

    一.原始方式: 取模显示字符 LCD显示屏是由width * height个像素点构成的,显示字符,一个非常容易想到的方法便是对字符取模,然后在LCD屏上打点显示字符:如果大家以前学习过单片机,想必接 ...

  7. Linux文本文件与Windows下的格式转换

    常常有时候在Linux下编写的程序,拷贝到Windows下,就会出现无法运行的状况.明明在Linux下成功编译且没任何问题的源代码为什么会到Windows下就出现n多个编译错误呢? 其实很简单,这个原 ...

  8. linux cp acp,CP_THREAD_ACP与CP_ACP

    在使用MultiByteToWideChar的时候,大部分都知道上述两个参数,MSDN上的解释也是简单到极致.通常我们会选择使用CP_ACP,但是总有人会在没有真正明白它们之间的区别前使用CP_THR ...

  9. 轻松实现各种文档格式转换,doc转pdf、doc转png图片、pdf转png图片,可以实现Windows、Linux、MacOS平台上部署(附源码和说明)

    轻松实现各种文档格式转换,doc转pdf.doc转png图片.pdf转png图片,可以实现Windows.Linux.MacOS平台上部署,可以通过命令行.shell脚本.python等方式调用. 实 ...

最新文章

  1. vue2 构建一个旅游类WebApp
  2. 举重若轻的人人车移动端数据平台
  3. Ubuntu 卸载 Nvidia 驱动和安装最新驱动
  4. action与servlet用法区别
  5. Python面试题之装饰器漫谈
  6. 文本分类和提取关键词算法_文本内容之间的关键词提取和相似度计算
  7. C#中struct和class的区别详解
  8. Windows Phone开发(11):常用控件(下) 转:http://blog.csdn.net/tcjiaan/article/details/7300085...
  9. 开源 免费 java CMS - FreeCMS1.5 标签 visit
  10. 201触摸ic应用电路_PCB板和集成电路的区别有哪些
  11. [转]undefined reference to 问题解决方法
  12. 2019第十届蓝桥杯B组C++省赛E题迷宫--BFS(倒搜)
  13. android camera textureview,Android SDK – camera2 – 在TextureView上绘制矩...
  14. AF 服务器安全防护实验
  15. android 高德定位失败,android 高德地图出现【定位失败key鉴权失败】
  16. 美国克莱姆森大学计算机专业排名,美国西北大学计算机专业排名怎么样?
  17. NoSQLBooster for MongoDB软件使用
  18. Blazor预研与实战
  19. 3G0众测靶场-0407 WriteUp
  20. 利用NAS免费部署动态解析实现内网穿透

热门文章

  1. 视觉导航定位系统工作原理及过程
  2. AI时代取代手机:语音交互设计漫谈
  3. 工作中的高效工具推荐,职场人士必备便签小工具
  4. Python NumPy 基础:数组和向量计算
  5. 【FreeRTOS】简介
  6. 09_NorFlash驱动
  7. EFR32MG21 with ADXL346
  8. IEEE754标准表示浮点数(详解)
  9. Adaptive Context Network for Scene Parsing
  10. qt add qrc - Files are not automatically added to the CMakeLists.txt