std::wcsxfrm

来自cppreference.com
< cpp‎ | string‎ | wide
定义于头文件 <cwchar>
std::size_t wcsxfrm( wchar_t* dest, const wchar_t* src, std::size_t count );

变换 src 所指向的空终止宽字符串为实现定义形式,满足在当前 C 本地环境中,用 std::wcscmp 比较二个变换后的字符串给出的结果与用 std::wcscoll 比较源字符串者相同。

将变换后字符串的首 count 个字符写入目标,包含空终止符,并返回完整的变换后字符串长度,排除空终止符。

count0 ,则允许 dest 为空指针。

注意

能接收整个变换后字符串的正确缓冲区长度是 1+std::wcsxfrm(NULL, src, 0)

在以同一宽字符串或宽字符串集进行本地环境依赖比较时使用此函数,因为只用 std::wcsxfrm 变换所有字符串一次,再以 std::wcscmp 进行后续比较更为高效。

参数

dest - 指向要写入变换后字符串到的空终止宽字符数组首元素的指针
src - 指向要变换的空终止宽字符串的指针
count - 要输出的最大字符数

返回值

变换后的空终止宽字符串的长度,不包含空终止字符。

示例

#include <iostream>
#include <cwchar>
 
int main()
{
    std::setlocale(LC_ALL, "sv_SE.utf8");
 
    std::wstring in1 = L"\u00e5r";
    std::wstring out1(1+std::wcsxfrm(nullptr, in1.c_str(), 0), L' ');
    std::wstring in2 = L"\u00e4ngel";
    std::wstring out2(1+std::wcsxfrm(nullptr, in2.c_str(), 0), L' ');
 
    std::wcsxfrm(&out1[0], in1.c_str(), out1.size());
    std::wcsxfrm(&out2[0], in2.c_str(), out2.size());
 
    std::wcout << "In the Swedish locale: ";
    if(out1 < out2)
         std::wcout << in1 << " before " << in2 << '\n';
    else
         std::wcout << in2 << " before " << in1 << '\n';
 
    std::wcout << "In lexicographical comparison: ";
    if(in1 < in2)
         std::wcout << in1 << " before " << in2 << '\n';
    else
         std::wcout << in2 << " before " << in1 << '\n';
 
}

输出:

In the Swedish locale: år before ängel
In lexicographical comparison: ängel before år

参阅

变换字符串,使得 strcmp 会返回与 strcoll 相同的结果
(函数)
变换字符串,使得能用比较替换对照
(std::collate<CharT> 的虚受保护成员函数)
按照当前本地环境比较两个宽字符串
(函数)