windows控制台程序——关于UNICODE字符的总结(转)
前言:从Windows NT/2000开如,Windows系统已经是一个标准的UNICODE系统,系统内部所有字符串存储及操作均使用UNICODE编码。因此Win32 API都是UNICODE版本的,但为了更好的本地化支持,也提供了MBCS(ANSI)版的Win32 API。UNICODE版Win32 API形式为xxxW,W(Wide)代表宽字符;MBCS(ANSI)版Win32 API形式为xxxA,A即ANSI。xxxA形式的Win32 API在被调用时,会先调用先根据“代码页转换表”执行由ANSI——UNICODE的转换,然后再调用xxxW形式的Win32 API去执行实际操作。即xxxA形式的Win32 API在被调用时只是先执行ANSI——UNICODE转换功能,然后再调用xxxA形式的Win32 API。
同样,Windows控制台也是标准的UNICODE系统功能,也有xxxA,xxxW两种对其操作的Win32 API,下面以WriteConsole为例。它也存在WriteConsoleA和WriteConsoleW两上版本,但我们在MSDN中找不到这两个原型型,可以在C:\Program Files\Microsoft Visual Studio\VC98\Include\WINCON.H在可以发现它的定义,并可以发现对它们进行控制的预定义语句。
#ifdef UNICODE
#define WriteConsole WriteConsoleW
#else
#define WriteConsole WriteConsoleA
#endif
一、Windows控制台输出
我们可以通过下面代码进行测试:
wchar_t test[] = L"测试1234";
DWORD ws;
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),test,wcslen(test),&ws,NULL);
//正确输出“测试1234”
char test[] = "测试1234";
DWORD ws;
WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE),test,wcslen(test),&ws,NULL);
//正确输出“测试1234”
若我们调用C库函数,可能会遇到点问题:
char test[] = "测试1234";
printf(test);
cout<<test;
//正确输出“测试1234”
wchar_t test[] = L"测试1234";
wprintf(test);
wcout<<test;
//什么也没输出
这是因为wprintf、wcout并不是真是意义上的支持UNICODE,它和printf、wcout一样内部调用都是xxxA版的Win32 API(如WriteConsoleA),只不过它们是先依据指定的“代码页转换表”,把UNICODE字符串转化为ANSI字符串,再去调用xxxA版的Win32 API。
setlocale(LC_ALL,"chs");
wchar_t test[] = L"测试1234";
wprintf(test);
wcout<<test;
//正确输出“测试1234”
整个过程可以这样描述:
GBK——————UNICODE ——————GBK——————UNICODE——————
L"" wcout xxxA API xxxW API
二、Windows控制台输入
仅从编码方式上讲,在Windows控制台进行字符输入,和在记事本、WORD中进行字符输入是一样的,字符存储的编码由输入法的编码方式决定。在简体中文XP上,我们使用“智能ABC”在文本中输入“ab中国”,当以二进制方式打开时,可以发现里面的二进制内容(GBK编码)为:
61 62 D6 D0 B9 FA
a b 中 国
只是我们可以在取得到字符的内存拷贝后,可以用相关函数进行转换和操作。
三、文件的读写
与其它关系到系统显示或控制函数不同,文件的读写函数不会关心系统的字符编码方式,只是的执行“内存——外存”的字节拷贝,与字符集的使用无关,故只提了一个版本。但有意思的是文件的创建和删除都有两版本,因为它涉及到了系统内部编码。
CreateFileA CreateFileW
DeleteFileA DeleteFileW
ReadFile
WriteFile
我们应注意“字符的存储”与“字符的显示”在编码方式上是独立的。例如使用UNICODE编码的Windows系统,“字符的显示”当然是UNICODE编码,但“字符的存储”则由用户决定,可以是ANSI(GB2312, GBK, JIS……)、也可以是UTF-16、UTF-32、UTF-8等。当采用非UNICODE编码并调用xxxA形式的win32 API时,Windows在显示时会先根据“代码页转换表”执行由ANSI——UNICODE的转换。
windows控制台程序——关于UNICODE字符的总结(转)的更多相关文章
- VS2017新建windows控制台程序打印中文乱码问题
最近刚换上VS2017,由于手头又要做个MFC的程序,所以写控制台程序做功能测试,然后发现居然乱码了. 于是用VS2017新建windows控制台应用程序,在main函数种加一句printf(&quo ...
- c程序实现unicode字符转utf-8字符
下面是一个unicode字符转换为utf-8的c程序实现: /* * ================================================================= ...
- Windows控制台程序“选定模式”的问题
最近用Nodejs写了个代理程序,一直用的好好的,木有问题,今天突然发现不能用了,使用telnet去连代理的端口也能连通,可是服务就是不能正常使用,提示连接超时. 当时猜测是Nodejs的某个地方阻塞 ...
- c#中重定向windows控制台程序的输出信息
这个问题来自论坛提问,答案如下.这只是一个简单的ipconfig命令.如果是复杂的,比如oracle的exp之类的命令,能在调用的时候显示出来,还是相当酷的. using System; using ...
- 你们信不信一句Console.WriteLine就能让你的控制台程序失去响应
好久没更新博客了,今天是扒衣见君节,难得闲下来就来说说一个最近有趣的发现吧. 首先废话不多说,直接上代码吧 class Program { static void Main(string[] args ...
- 如何利用java把文件中的Unicode字符转换为汉字
有些文件中存在Unicode字符和非Unicode字符,如何利用java快速的把文件中的Unicode字符转换为汉字而不影响文件中的其他字符呢, 我们知道虽然java 在控制台会把Unicode字符直 ...
- Windows 程序支持 Unicode
宽字符 阅读了 UTF-8 Everywhere 一文,推荐在程序中对于字符串都使用 UTF-8 编码.Unix-like 系统默认是支持 UTF-8 编码的Unicode字符串,标准库函数也默认支持 ...
- C Windows控制台字符版本俄罗斯方块
//一个可以工作在Windows控制台字符界面下的俄罗斯方块 //工作在非图形模式,无需其他库依赖,单个C文件代码即可运行 //支持最高纪录,并且对于纪录进行了加密 //By wrule 2015年1 ...
- [C/C++]宽字符与控制台程序
转自:http://www.cnblogs.com/zplutor/archive/2010/11/27/1889227.html 在我刚开始学C/C++的时候,字符类型使用的都是char.接触Win ...
随机推荐
- pip install 升级时候 出现报asciii码错误的问题。
原因是pip安装python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码.解决办法是: python目录 Python27\Lib\site-packages 建一个文件site ...
- 学习总结——JMeter做http接口功能测试
JMeter对各种类型接口的测试 默认做接口测试前,已经给出明确的接口文档(如,http://test.nnzhp.cn/wiki/index.php?doc-view-59):本地配好了JMeter ...
- 读书笔记--C陷阱与缺陷(六)
第六章 1.预处理器:预处理器先对代码进行必要的转换处理,简化编程者的工作. 它的重要原因有以下两点: a. 假如要将程序中出现的所有实例都加以修改,但希望只改动程序一处数值,重新编译实现. 预处理器 ...
- python包安装-centos7/windows
1.修改pip源 临时使用: 可以在使用pip的时候在后面加上-i参数,指定pip源 eg: pip install scrapy -i https://pypi.tuna.tsinghua.edu. ...
- Linux学习笔记:touch新建文件、修改访问、改动时间
touch用于创建新的空文件或者修改已有文件的时间戳. 语法:touch file.txt 如果file存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间. 如果file不 ...
- Web前端开发最佳实践(10):JavaScript代码不好读,不好维护?你需要改变写代码的习惯
前言 这篇文章本应该在上一篇文章:使用更严格的JavaScript编码方式,提高代码质量之前发布,但当时觉得这篇文章太过基础,也就作罢.后来咨询了一些初级的开发者,他们觉得有必要把这篇文章也放上来.尽 ...
- 【51nod】1934 受限制的排列
题解 这题还要判无解真是难受-- 我们发现我们肯定能确定1的位置,1左右的两个区间是同理的可以确定出最小值的位置 我们把区间最小值看成给一个区间+1,构建出笛卡尔树,就求出了每一次取最小值和最小值左右 ...
- jenkins中管理用户
jenkins中管理用户: 管理用户权限
- 有关FPGA
在FPGA发展历史上,前后共有过超过50家厂商,在国外目前剩下不到10家,除赛灵思和ALTERA两家持续不断地军备竞赛,其它的都有着各自固守的市场定位.即使是有新进入者,例如受英特尔新工艺支 ...
- ASL测试 课题测试博客
已知线性表具有元素{5,13,19,21,37,56,64,75,80,88,92},如果使用折半查找法,ASL是多少? 知识点1: 折半查找法:折半查找,又称作二分查找.这个查找的算法的特点,要求数 ...