C/C++语言对宽字符集的处理
我们接触C语言中的字符是从char开始的,但是众所周知,char类型是不支持中文的,于是那些先贤们把字符扩展为宽字符来表示一些非ANSI字符。 但是没有C语言标准支持的话,各个厂商又要开始各自为政,C语言的代码跨平台优势也就没有了,所以C99添加了对宽字符的支持。
C语言对宽字符的支持
wchar_t
对应与常见的char,宽字符版的char是wchar_t,wchar_t不是内置类型,而是定义在wchar.h文件中的。
有了wchar_t,我们可以在程序中存储宽字符了。
另外,wchar.h中定义了一个极为有用的宏L,它用来存储wchar_t常量。举例如下:
L”鲁”,L’鲁’ 分别表示的是字符串鲁和宽字符鲁。至于”鲁”,则在不同的平台下有不同的程序内表示方法,不跨平台。
wscanf, wprintf
能存储宽字符后,我们还得输入输出宽字符,所以wscanf, wprintf, wgets 等等函数都出现了,他们都是对应函数的宽字符版。
wscanf和wprintf的第一个参数是指向wchar_t的指针,为格式化字符串。
为了能同时输入ANSI字符和宽字符,%s和%c依旧用来输入ANSI字符,而%ls和%lc则用来输入宽字符。
举例如下:
1 |
|
注:必须用setlocale函数来设置输出字符集,负责可能输出乱码。
其他
wchar.h
定义了WCHAR_MIN, WCHAR_MAX来表示wchar_t的最小最大值,定义了WEOF来表示eof。
wctype.h
定义了iswdigit, iswupper等函数,但是它们仍然只对英文表示法有效;最典型的例子是iswdigit(L’一’)返回假。
C++中的宽字符
注意:C++中也要使用setlocale(LC\_CTYPE, "");
来设置宽字符输出的字符集。
wstring
在string中定义了wstring类来表示宽字符串,比如:
1 | wstring wstr=L"请输入您的姓:"; |
wcin, wcout, wcerr
为了输入输出宽字符,仍然需要定义cin, cout的宽字符版,于是wcin, wcout应运而生。
最后来个例子:
1 |
|
C/C++语言对宽字符集的处理