当前位置: 首页 > article >正文

std::locale多语言切换

std::locale 使用总结:

std::locale可以结合use_facet来使用:
常见的user_facet有结合ctype、codecvt、time_get、time_put等,下面结合time_get和ctype为例分别讲解用法和调试过程中遇到的问题

使用ctype获取多语言字母

    std::stringstream ss{};
    std::locale loc("");
    locale loc1("de_DE"), loc2("English_Australia");
    ss.imbue(loc1);
    bool result1 = use_facet<ctype<char>>(loc1).is(
        ctype_base::alpha, '\xe4'
    );
    bool result2 = use_facet<ctype<char> >(loc2).is(ctype_base::alpha, '!'
    );
    if (result1)
        ss << "The character" << '\xe4' << "'in locale loc1 is alphabetic."
        << endl;
    else
        ss << "The character" << de_char[28] << "in locale loc1 is not alphabetic."
        << endl;
    if (result2)
        ss << "The character '!' in locale loc2 is alphabetic."
        << endl;
    else
        ss << "The character '!' in locale loc2 is not alphabetic."
        << endl;
    ss << loc.name() << endl;

注意:

  1. vs中编码页默认是基于936编码页,如果要输入特殊德语字符,这里需要调整添加额外编译选项参数/utf8
  2. 德语中的特殊字母是无法通过VS编译的程序窗口界面正常显示的,除非修改系统语言区域为德语。
  3. 如果系统为简体中文,想获取德语字母在utf8中的二进制,可以通过如下方式获取,在nodepad++中切换语言为德语输入对应德语字母,然后修改保存为utf8格式即可获取对应的二进制编码

使用time_get获取多语言表示

      std::stringstream ss{};
      //std::locale::global(std::locale("en_US.UTF-8"));
      std::locale loc("zh-CN.UTF-8");
      std::tm time_info;
      std::istringstream iss("周四");
      istreambuf_iterator<char> end;
      std::ios_base::iostate err = std::ios_base::goodbit;
      const std::time_get<char>& dateReader = use_facet<time_get<char>>(loc);
      dateReader.get(iss, end, iss, err, &time_info,'a');
      ss.imbue(std::locale("zh-CN"));
      ss << std::put_time(&time_info, "%a");
      return ss.str().c_str();

注意:

  1. 中文对应的locale为zh-CN,具体可以通过遍历系统支持的locale来查看本机使用的语言对应的locale
  2. 这里通过time_get和use_facet的结合使用方式来转换,如果iss中的字符和loc对应的多语言存储不一致会导致crash异常。
  3. user_face能够存储loc的原因是通过_GetCat的静态方法将locinfo作为构造入参
  4. ‘a’,‘A’ 是weekday的含义,注意iss输入字符一定要和‘a’ 以及locinfo语言保持匹配上

本地迭代获取支持的locale

   BOOL CALLBACK MyFuncLocaleEx(LPWSTR pStr, DWORD dwFlags, LPARAM lparam)
   {
       locals.push_back(pStr);
       return TRUE;
   }
  
      EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALTERNATE_SORTS, NULL, NULL);
      std::wstringstream ss{};
      for (vector<wstring>::const_iterator str = locals.begin(); str != locals.end(); ++str)
          ss << *str << endl;

http://www.kler.cn/a/381065.html

相关文章:

  • 电脑出现 0x0000007f 蓝屏问题怎么办,参考以下方法尝试解决
  • ubuntu 24.04-无域名创建本机和局域网和同网段局域网机器可访问的https网页服务
  • 利用Gurobi追溯模型不可行原因的四种方案及详细案例
  • XMLHttpRequest的基础知识
  • 【专题】2024年悦己生活消费洞察报告汇总PDF洞察(附原数据表)
  • CNN回归-卷积神经网络(Convolutional Neural Network)
  • 在软件设计时,怎样寻找和确定对象,以及设计模式的作用
  • Java 8 中引入的 Comparator 工具方法
  • C++:unordered_set、unordered_map类
  • Spring Cloud数据库从MySQL切换到OceanBase
  • redis缓存雪崩、击穿、穿透
  • 江协科技STM32学习- P36 SPI通信外设
  • 【C++篇】在秩序与混沌的交响乐中: STL之map容器的哲学探寻
  • Chrome 130 版本新特性 Chrome 130 版本发行说明
  • 双指针算法篇——一快一慢须臾之间解决问题的飘逸与灵动(2)
  • ORA-00020和ORA-00603报错处理
  • Linux高阶——1103——Signal信号机制
  • 【Stable Diffusion】
  • 家具组装行业产品说明书的创新与优化
  • 鸿蒙笔记--tsets
  • 探索 Move 编程语言:智能合约开发的新纪元
  • CSRF初级靶场
  • 文件操作:使用ByteArrayInputStream
  • A010-基于SpringBoot的宠物健康咨询系统的设计与实现
  • 【LeetCode】【算法】739. 每日温度
  • Harmony项目基础