windows应用程序开发系列四:宽字符问题详解

windows应用程序开发系列四:宽字符问题详解一 上节遗留的问题上节的程序中 wprintf 并不能在屏幕上打印出来我们指定的中文字符串 而 printf 却能正确的打印出来正确的中文字符串 这是为什么呢 我们都知道 char 类型采用 DBCS 的编码方式 用 1 个 8

大家好,欢迎来到IT知识分享网。

一、上节遗留的问题

上节的程序中,wprintf()并不能在屏幕上打印出来我们指定的中文字符串,而printf()却能正确的打印出来正确的中文字符串,这是为什么呢?

我们都知道,char类型采用DBCS的编码方式,用1个8位代表代表一个英文字符,而用2个8位代表一个中文字符。而wchar_t类型采用UNICODE的编码方式,这种编码方式所有的字符统统占用2个字节的空间,所以一个英文字符占用16位,一个汉字也占16位空间,全球任意国家通用的。所以在打印的时候,必须指明国家,说明是那个国家的文字。那么如何解决呢?这里有两种方式。

1 指定中文方法是setlocale(LC_ALL,”chs”);使用这个函数必须包含头文件”locale.h”;

2 使用WriteConsole()函数,具体原型如下:

BOOL WriteConsole( HANDLE hConsoleOutput, // 标准输出设备句柄  CONST VOID *lpBuffer, // 输出内容buf DWORD nNumberOfCharsToWrite, // 输出内容长度  LPDWORD lpNumberOfCharsWritten, // 实际输出内容长度  LPVOID lpReserved // 备用,为NULL );

二、代码实践——打印所有的中文字符,这里提供两套代码,供大家参考。

</pre><pre name="code" class="cpp">#include "stdafx.h" #include "windows.h" #include "stdio.h" #include "locale.h" void PrintUnicode() { for (WORD nHigh = 0; nHigh < 256; nHigh++) { for(WORD nLow = 0; nLow < 256; nLow++) { wchar_t Wchar = nHigh*256 + nLow; wprintf(L"%s",&Wchar); } printf("\n"); } } int main(int argc, char* argv[]) { setlocale(LC_ALL,"chs"); PrintUnicode(); return 0; } 
程序运行界面截图

windows应用程序开发系列四:宽字符问题详解


利用GetStdHandle()函数来得到三个标准句柄,即标准输出句柄,标准输入句柄,和标准错误句柄。在调用WriteConsole()函数的时候,第一个参数就是标准输出句柄,需要使用GetStdHandle()函数获取,该函数的原型如下:

HANDLE GetStdHandle( DWORD nStdHandle );函数参数的取值如下:

STD_INPUT_HANDLE

STD_OUTPUT_HANDLE

STD_ERROR_HANDLE


#include "stdafx.h" #include "windows.h" #include "stdio.h" void PrintUnicode() { HANDLE hStd = GetStdHandle(STD_OUTPUT_HANDLE); for (WORD nHigh = 0; nHigh < 256; nHigh++) { for(WORD nLow = 0; nLow < 256; nLow++) { wchar_t Wchar = nHigh*256 + nLow; WriteConsole(hStd,&Wchar,1,NULL,NULL); } printf("\n"); } } int main(int argc, char* argv[]) { PrintUnicode(); return 0; } 




免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/152987.html

(0)
上一篇 2025-03-06 18:05
下一篇 2025-03-06 18:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信