《windows核心编程》第2章 UNICODE字符

一、基础内容

1.1 UNICODE和UTF-8

下面是我个人的理解

UNICODE用2个字节来代表一个字符

UTF-8用1-4个字节来表示一个字符。可变长度的实现原理是ASCII字符只有7位,首位如果是1表示不是ASCII,说明这个字符和后面的字符联合起来形成新字符。

1.2 字符的数据类型

UNICODE类型的字符都是宽字符,在C语言中的数据类型是:wchar_t,这是一个基本数据类型

用宏TEXT()可以兼容宽字符和char字符。如果在程序中定义了UNICODE,那么会把TEXT()中的字符认为是wchar_t*;如果没定义,则把TEXT()中的字符认为是char*

同样的,根据是否定义UNICODE,接收用TCHAR

1.3 测试

1、没有定义UNICODE

2、定义了UNICODE

3、控制台打印宽字符会有错误

(1) Windows的控制台根据系统非UNICODE编码及位置的设置,控制台在输出中文时默认是GBK编码,控制台输出UTF8字符会变成乱码。采用宽字符输出,这样就避免了控制台字符集的问题

(2) 控制台宽字符显示有个必要的条件:控制台的字体应当支持宽字符。将控制台的代码页修改为
437(OEM-United States),默认的Lucida Console字体支持宽字符,使用_setmode来设置标准输出为_O_U16TEXT

_setmode(_fileno(stdout), _O_U16TEXT);

二、使用安全字符串

我们编程的时候,尽量使用安全字符串,例如strcpy就是一个非安全函数,当你在程序中使用这个函数的时候,你就会发现,编译器会出现警告,同时会提示我们使用strcpy_s函数

三、补充函数

3.1 wcslen()

求宽字符串长度的函数 wcslen(TEXT("str.."));

3.2 stringCchCat()

将一个字符串连接到另一个字符串

HRESULT stringCchCat(
        __inout LPTSTR pszDest,
        __in size_t cchDest,
        __in LPCTSTR pszSrc
);

pszDest:目标字符串 

cchDest:目标字符串内存大小

pszSrc:源字符串

3.3 StringCchPrintf()

这是一个字符串拷贝函数,在strsafe.h中

HRESULT stringcchprintf(
        __out LPTSTR pszDest,
        __in size_t cchDest,        // 目标内存大小.
        __in LPCTSTR pszFormat,
        __in ...
);

这个函数和printft函数用法类似,只是将字符写入了psDest内存块中

3.4 字符串比较函数

compareString()和compareStringOrdinal()

3.5 宽字符与多字符之间的转换

int Multi ByteTowideChar(
    __in UINT CodePage,
    __in DWORD dwFlags, 
    __in LPCSTR lpMultiByteStr,
    __in int cbMultiByte,
    __out LPWSTR lpwideCharstr,
    __in int cchwideChar
);

int wideCharToMultiByte(
    __in UINT CodePage,
    __in DWORD dwFlags, 
    __in LPCWSTR lpWideCharstr,
    __in int cchwideChar,
    __out LPSTR lpMu1tiBytestr,
    __in int cbMultiByte, 
    __in LPCCH lpDefaultChar,
    __out LPBOOL lpUsedDefaultChar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

herb.dr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值