std::wcsxfrm

From cppreference.com
< cpp‎ | string‎ | wide
Defined in header <cwchar>
std::size_t wcsxfrm( wchar_t * dest, const wchar_t * src, std::size_t count ) ;

Transforms the null-terminated wide string pointed to by src into the implementation-defined form such that comparing two transformed strings with std::wcscmp gives the same result as comparing the original strings with std::wcscoll

The first count

If count is 0, then dest

Notes

The correct length of the buffer that can receive the entire transformed string is 1 + std:: wcsxfrm (nullptr, src, 0 )

This function is used when making multiple locale-dependent comparisons using the same wide string or set of wide strings, because it is more efficient to use std::wcsxfrm to transform all the strings just once, and subsequently compare the transformed wide strings with std::wcscmp

Parameters

dest - pointer to the first element of a wide null-terminated string to write the transformed string to
src - pointer to the null-terminated wide character string to transform
count - maximum number of characters to output

Return value

The length of the transformed wide string, not including the terminating null-character.

Example

#include <cwchar>
#include <iostream>
 
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';
 
}

Output:

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

See also

transform a string so that strcmp would produce the same result as strcoll
(function)
[virtual]
transforms a string so that collation can be replaced by comparison
(virtual protected member function of std::collate<CharT>)
compares two wide strings in accordance to the current locale
(function)
C documentation for wcsxfrm