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
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
wchar_t wstr[11];

setlocale(LC_CTYPE, "");

if (wscanf(L"%10ls", wstr))
wprintf(L"%ls\n", wstr);
return 0;
}

注:必须用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <wchar.h>
#include <locale.h>

using namespace std;

int main() {
setlocale(LC_CTYPE, "");

wstring wstr = L"请输入您的姓:";
wcout << wstr << endl;
wcin >> wstr;
wcout << wstr << L"先生,您好!" << endl;
return 0;
}

C/C++语言对宽字符集的处理

https://robberphex.com/c-cpp-wide-charset/

作者

Robert Lu

发布于

2013-09-08

许可协议

评论