关键名词部分:
Unicode: Unicode 扩展自 ASCII 字元集
ASCII 美国资讯交换标准码 American Standard Code for Information Interchange Size:7 位元
ISO: 国际标准化组织 (ISO:International Standards Organization)
内码:11010001 10100111 存储在计算机内部的二进制编码
双位元组字元集 DBCS:double-byte character set
指向宽字串的指标:wchar_t * p = L"Hello!" ;
L(代表「long」)。这将告诉编译器该字串按宽字元保存 字符串结束标志\0占用两个字节
兼容双字节函数:
iLength = strlen § ;//报错
size_t __cdecl wcslen (const wchar_t *) ;
iLength = wcslen( p);//宽字节版
wcslen(); //include<tring.h/WCHAR.H>
size_t __cdecl wcslen (const wchar_t *) ;
微观意识:
字串「Hello!」中的 6 个字元占用 16 位元:
0x0048 0x0065 0x006C 0x006C 0x006F 0x0021 0x0000
Intel 处理器在记忆体中将其存为:(大小端)
48 00 65 00 6C 00 6C 00 6F 00 21 00 00 00
处理方式
使用 Microsoft Visual C++包含的 TCHAR.H 表头档案。该表头档案不是 ANSI C 标准的一部分,因此那里定义的每个函式和巨集定义的前面都有一条底线_
TCHAR.H 为需要字串参数的标准执行时期程序库函式提供了一系列的替代名称(例如,_tprintf 和_tcslen),它们既可以指向函式的 Unicode 版也可以指向非 Unicode 版。
TEXT(“XXX”);兼容Unicode 与 非Unicode
有:_UNICODE && WCHAR.H
那么_tcslen 就定义为 wcslen:#define _tcslen wcslen
如果没有定义 UNICODE,则_tcslen 定义为 strlen:#define _tcslen strlen
核心部分代码:
typedef wchar_t TCHAR ;
#define __T(x) L##x
这是相当晦涩的语法,但合乎 ANSI C 标准的前置处理器规范。那一对井字号称为「粘贴符号(token paste)」,它将字母 L 添加到字符串上。因此,如果巨集引数是"Hello!",则 L##x 就是 L"Hello!"。
#define _TEXT(x) __T(x)
本地,必须按下述方法在_T 或_TEXT 巨集内定义字串文字:_TEXT (“Hello!”)