宽字符类似于字符数据类型,不同之处在于宽字符占用空间的两倍,因此可以采用更大的值。 char可以采用256个值,这些值对应于ASCII表中的条目。另一方面,宽字符可以采用65536个值,该值与UNICODE值相对应,UNICODE值是最新的国际标准,它允许对几乎所有语言和常用符号的字符进行编码。
- 就像字符常量的类型是char一样,宽字符的类型也是wchar_t。
- 此数据类型占用2或4个字节,具体取决于所使用的编译器。
- 通常,当使用日语等国际语言时,将使用wchar_t数据类型。
下面是一个简单的C++实现,以显示如何使用wchar_t:
// An example C++ program to demonstrate use of wchar_t
#include
using namespace std;
int main()
{
wchar_t w = L'A';
cout << "Wide character value:: " << w << endl ;
cout << "Size of the wide char is:: " << sizeof(w);
return 0;
}
输出:
Wide character value:: 65
Size of the wide char is:: 4
- L是宽字符字面量和宽字符字符串字面量的前缀,它告诉编译器该char或字符串的类型为wide-char。
- 在操作宽字符类型时,w在扫描(wcin)或打印(wcout)之类的操作中带有前缀。
宽字符类型数组或字符串:
就像char类型的数组字符串,也可以有一个宽char类型的数组字符串。下面是显示宽字符类型数组字符串的C++实现:
// An example C++ program to demonstrate use
// of wchar_t in array
#include
using namespace std;
int main()
{
// char type array string
char caname[] = "geeksforgeeks" ;
cout << caname << endl ;
// wide-char type array string
wchar_t waname[] = L"geeksforgeeks" ;
wcout << waname << endl;
return 0;
}
输出:
geeksforgeeks
geeksforgeeks
输出是相同的,但是唯一的区别是宽字符数组使用两倍的内存来编码每个字符。
宽字符数组字符串:
宽字符数组字符串的大多数功能在头文件cwchar中定义。
wcslen():语法:size_t wcslen(const wchar_t * wcs);
它返回宽字符串的长度。这相当于strlen的宽字符。
下面是一个简单的C++实现,以显示如何获取宽字符数组字符串的长度。
// An example C++ program to demonstrate use
// of wcslen()
#include
#include
using namespace std;
int main()
{
// wide-char type array string
wchar_t waname[] = L"geeksforgeeks" ;
wcout << L"The length of '" << waname
<< L"' is " << wcslen(waname) << endl;
return 0;
}
输出:
The length of 'geeksforgeeks' is 13
wcscpy():语法:wchar_t * wcscpy(wchar_t * strDestination,const wchar_t * strSource);
wcscpy()代表宽字符字符串复制。它将strSource指向的宽字符字符串复制到strDestination指向的宽字符数组。这与strcpy的宽字符等效。
下面是一个简单的C++实现,以显示wcscpy的用法:
// An example C++ program to demonstrate use
// of wcscpy()
#include
#include
using namespace std;
int main()
{
wchar_t waname[] = L"geeksforgeeks" ;
wchar_t wacopy[14];
wcscpy(wacopy, waname);
wcout << L"Original = " << waname
<< L"\nCopy = " << wacopy << endl;
return 0;
}
输出:
Original = geeksforgeeks
Copy = geeksforgeeks
wcscat():语法:wchar_t * wcscat(wchar_t * strDestination,const wchar_t * strSource);
wcscat()代表宽字符字符串连接。将strSource宽字符串的副本追加到strDestination宽字符串。这与strcat的宽字符等效。
下面是一个简单的C++实现,以显示wcscat的用法:
// An example C++ program to demonstrate use
// of wcscat()
#include
#include
using namespace std;
int main()
{
wchar_t string1[] = L"geeksforgeeks" ;
wchar_t string2[] = L" is for Geeks" ;
wcscat(string1, string2);
wcout << L"Concatenated wide string is = "
<< string1 << endl;
return 0;
}
输出:
Concatenated wide string is = geeksforgeeks is for Geeks
wcscmp():语法:int wcscmp(const wchar_t * wcs1,const wchar_t * wcs2);
wcscmp()代表宽字符字符串比较。如果wcs1和wcs2相等,则返回0;如果不匹配的第一个宽字符在wcs1中的值大于在wcs2中的值,则返回大于零的值。如果第一个不匹配的宽字符在wcs1中的值小于在wcs2中的值,则返回小于零的值。这是strcmp的宽字符等效项。
下面是一个简单的C++实现,以显示wcscmp的用法:
// An example C++ program to demonstrate use
// of wcscmp()
#include
#include
using namespace std;
int main()
{
wchar_t string1[] = L"geeksforgeeks" ;
wchar_t string2[] = L"GEEKS" ;
wcout << L"Comparison1 = "
<< wcscmp(string1, string2) << endl;
wcout << L"Comparison2 = "
<< wcscmp(string1, string1) << endl;
wcout << L"Comparison3 = "
<< wcscmp(string2, string1) << endl;
return 0;
}
输出:
Comparison1 = 1
Comparison2 = 0
Comparison3 = -1
wcstok():语法:wchar_t * wcstok(wchar_t * str,const wchar_t * delim,wchar_t ** ptr);
wcstok()代表宽字符字符串标记化。在以str指向的以空值终止的宽字符串查找下一个标记。分隔字符由delim指向的以空终止的宽字符串标识。
str –指向以null终止的宽字符串以进行标记化的指针。
delim –指向以null终止的宽字符串标识分隔符的指针。
ptr –指向wchar_t *类型的对象的指针,wcstok使用该指针存储其内部状态。
这是strtok()的宽字符等效项。
下面是一个简单的C++实现,以显示wcstok的用法:
// An example C++ program to demonstrate use
// of wcstok()
#include
#include
using namespace std;
int main()
{
wchar_t string[] = L"geeksforgeeks,is,for,GEEKS" ;
wchar_t* internal_state;
wchar_t delim[] = L"," ;
wchar_t* token = wcstok(string, delim, &internal_state);
while (token)
{
wcout << token << endl;
token = wcstok(NULL, delim, &internal_state);
}
return 0;
}
输出:
geeksforgeeks
is
for
GEEKS
wcsncpy():语法:wchar_t * wcsncpy(wchar_t *目标,const wchar_t *源,size_t n);
将源的前n个宽字符复制到目标。如果在复制n个字符之前找到源宽度字符串的末尾,则将目标位置附加其他空宽度字符填充到总共n个字符为止。这与strncpy()的宽度字符等效。
下面是一个简单的C++实现,以显示wcsncpy的用法:
// An example C++ program to demonstrate use
// of wcsncpy()
#include
#include
using namespace std;
int main()
{
wchar_t string1[] = L"Geeks For Geeks";
wchar_t string2[20];
wchar_t string3[20];
wcsncpy(string2, string1, 20);
// partial copy
wcsncpy(string3, string2, 5);
string3[5] = L'\0'; // null character manually added
wcout << string1 << endl << string2
<< endl << string3 ;
return 0;
}
输出:
Geeks For Geeks
Geeks For Geeks
Geeks
wcsstr():语法:const wchar_t * wcsstr(const wchar_t * wcs1,const wchar_t * wcs2);
返回指向wcs1中第一次出现的wcs2的指针。如果wcs2不属于wcs1,则返回空指针。在这里,WCS1是要扫描的宽和WCS2包含序列相匹配。这与strstr()的宽字符等效。
下面是一个简单的C++实现,以显示wcsstr的用法:
// An example C++ program to demonstrate use
// of wcsstr()
#include
#include
using namespace std;
int main()
{
wchar_t string1[] = L"Geeks Are Geeks";
wchar_t* string2 = wcsstr(string1, L"Are");
wcsncpy(string2, L"For", 3);
wcout << string1 << endl;
return 0;
}
输出:
Geeks For Geeks
参考:
http://www.cplusplus.com/reference/cwchar/