本地化库
本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C++ 标准库的其他组件的行为。
平面类别
定义字典序比较和字符串的散列
std::collate
template< class CharT > |
类 std::collate 封装字符串的本地环境限定对照(比较)和哈希。此平面为 std::basic_regex 所用,并能以 std::locale::operator() 直接应用到所有期待 string 比较谓词的标准算法。
继承图
标准库提供二个孤立(不依赖本地环境)的特化:
定义于头文件 | |
std::collate<char> | 实现字节字符串的字典序定序 |
std::collate<wchar_t> | 实现宽字符串的字典序定序 |
另外, C++ 程序中构造的每个 locale 对象都实装这些特化的其自身(本地环境限定)版本。
成员类型
成员类型 | 定义 |
char_type | CharT |
string_type | std::basic_string<CharT> |
调用 do_transform & 变换字符串,使得能用比较替换对照
std::collate<CharT>::transform,
std::collate<CharT>::do_transform
public: | (1) | |
protected: | (2) |
1) 公开成员函数,调用最终导出类的受保护虚成员函数 do_transform
。
2) 转换字符序列 [low, high)
为 string ,使得它与在另一字符串上调用 transform()
的结果以字典序比较,会产生在二个相同字符串上调用 do_compare() 的相同结果。
参数
low | - | 指向要变换的字符序列中首字符的指针 |
high | - | 要变换的序列的尾后一位置指针 |
返回值
变换后的字符串,它使得被变换字符串的字典序比较能用于取代原字符串的对照。 "C" 本地环境中,返回的字符串为 [low, high)
的准确副本。其他本地环境中,返回字符串的内容是实现定义的,而且可考虑到大小可能更长。
注意
在对照中的使用外,被变换字符串的本地环境限定格式还为 std::regex_traits::transform_primary 所知,它能释出等价类信息。
调用示例 linux
#include <iostream>
#include <iomanip>
#include <locale>int main()
{std::locale::global(std::locale("sv_SE.utf8"));auto& f = std::use_facet<std::collate<wchar_t>>(std::locale());std::wstring in1 = L"\u00e4ngel";std::wstring in2 = L"\u00e5r";std::wstring out1 = f.transform(&in1[0], &in1[0] + in1.size());std::wstring out2 = f.transform(&in2[0], &in2[0] + in2.size());std::wcout << "In the Swedish locale: ";if (out1 < out2){std::wcout << in1 << " before " << in2 << std::endl;}else{std::wcout << in2 << " before " << in1 << std::endl;}std::wcout << "In lexicographic comparison: ";if (in1 < in2){std::wcout << in1 << " before " << in2 << std::endl;}else{std::wcout << in2 << " before " << in1 << std::endl;}return 0;
}
输出
In the Swedish locale: år before ängel
In lexicographic comparison: ängel before år
调用示例 windows
#include <locale>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <Windows.h>std::vector<std::wstring> locals;BOOL CALLBACK MyFuncLocaleEx(LPWSTR pStr, DWORD dwFlags, LPARAM lparam)
{locals.push_back(pStr);return TRUE;
}std::string stows(const std::wstring& ws)
{std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";setlocale(LC_ALL, "chs");const wchar_t* _Source = ws.c_str();size_t _Dsize = 2 * ws.size() + 1;char *_Dest = new char[_Dsize];memset(_Dest, 0, _Dsize);wcstombs(_Dest, _Source, _Dsize);std::string result = _Dest;delete[]_Dest;setlocale(LC_ALL, curLocale.c_str());return result;
}int main()
{EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALTERNATE_SORTS, NULL, NULL);for (std::vector<std::wstring>::const_iterator strIt = locals.begin();strIt != locals.end(); ++strIt){std::locale::global(std::locale(stows(*strIt)));auto& f = std::use_facet<std::collate<wchar_t>>(std::locale());std::wstring in1 = L"\u00e4ngel";std::wstring in2 = L"\u00e5r";std::wstring out1 = f.transform(&in1[0], &in1[0] + in1.size());std::wstring out2 = f.transform(&in2[0], &in2[0] + in2.size());std::wcout << "In the " << *strIt << " locale: ";if (out1 < out2){std::wcout << in1 << " before " << in2 << std::endl;}else{std::wcout << in2 << " before " << in1 << std::endl;}std::wcout << "In lexicographic comparison: ";if (in1 < in2){std::wcout << in1 << " before " << in2 << std::endl;}else{std::wcout << in2 << " before " << in1 << std::endl;}}return 0;
}
输出
In the de-DE_phoneb locale: ?ngel before ?r
In lexicographic comparison: ?ngel before ?r
In the es-ES_tradnl locale: ?ngel before ?r
In lexicographic comparison: ?ngel before ?r
In the hu-HU_technl locale: ar before ?ngel
In lexicographic comparison: ?ngel before ar
In the ja-JP_radstr locale: angel before ar
In lexicographic comparison: angel before ar
In the ka-GE_modern locale: