本文共 2472 字,大约阅读时间需要 8 分钟。
转载自:
国际化(Internationalization,简写为i18n)
国际化的主要思路是以locale(地域、本土、国别)对象来代表一个可扩展的面貌集合, 以此进行地区转换工作。Locale在C中已经有所应用,
但在C++的标准中,locale被泛化,设计得更有弹性。事实上,C++ locale机制可以根据用户环境或者偏好进行定制,
例如可以对它进行扩展,使他能够处理时区、纸张规格等问题C++ stream进行I/O时,所有的数值会更加locale规定的规则自动进行格式化
程序员也可以使用locale对象进行直接格式化、校勘(collation)、字符分类等工作。string和stream中使用了char_traits
template<typename _CharT> struct char_traits { typedef _CharT char_type; typedef typename _Char_types<_CharT>::int_type int_type; typedef typename _Char_types<_CharT>::pos_type pos_type; typedef typename _Char_types<_CharT>::off_type off_type; typedef typename _Char_types<_CharT>::state_type state_type;static void assign(char_type& __c1, const char_type& __c2) { __c1 = __c2; }
static bool eq(const char_type& __c1, const char_type& __c2) { return __c1 == __c2; }
static bool lt(const char_type& __c1, const char_type& __c2) { return __c1 < __c2; }
static int compare(const char_type* __s1, const char_type* __s2, std::size_t __n) { for (size_t __i = 0; __i < __n; ++__i) if (lt(__s1[__i], __s2[__i])) return -1; else if (lt(__s2[__i], __s1[__i])) return 1; return 0; }
static std::size_t length(const char_type* __s) { std::size_t __i = 0; while (!eq(__p[__i], char_type())) ++__i; return __i; }
static const char_type* find(const char_type* __s, std::size_t __n, const char_type& __a) { for (std::size_t __i = 0; __i < __n; ++__i) if (eq(__s[__i], __a)) return __s + __i; return 0; }
static char_type* move(char_type* __s1, const char_type* __s2, std::size_t __n) {return static_cast<_CharT*>(std::memmove(__s1, __s2, __n * sizeof(char_type))); }
static char_type* copy(char_type* __s1, const char_type* __s2, std::size_t __n) { std::copy(__s2, __s2 + __n, __s1); return __s1; }
static char_type* assign(char_type* __s, std::size_t __n, char_type __a) { std::fill_n(__s, __n, __a); return __s; }
static char_type to_char_type(const int_type& __c) { return static_cast<char_type>(__c); }
static int_type to_int_type(const char_type& __c) { return static_cast<int_type>(__c); }
static bool eq_int_type(const int_type& __c1, const int_type& __c2) { return __c1 == __c2; }
static int_type eof() { return static_cast<int_type>(EOF); }
static int_type not_eof(const int_type& __c) { return !eq_int_type(__c, eof()) ? __c : to_int_type(char_type()); } };
处理特殊字符:
如换行符('\n')、EOF等 类basic_ios提供了成员函数widen(),narrow()来处理这个问题 如: strm.widen('\n'); strm.widen('\0'); 函数widen(),narrow()实际上使用了一个locale对象,更确切的说是该对象的ctype facet ,这个facet用来对所有字符"在char和其他表现形式之间"进行转换.