c++标准库locale

  • 一、locale
  • 二、设置locale (std::locale::locale)
  • 三、获取locale的名字 (std::locale::name)
  • 四、设置全局locale(std::locale::global)
  • 五、out.getloc、out.imbue
  • 六、facet

上篇主要讲解了c语言的标准库<locale.h>,本篇文章主要讲解下c++的标准库locale。

  • 真正的国际化来说,仅仅翻译“文字所带的信息”通常是不够的。各种不同的数值、货币、日期…的规格也都必须准守。另外,用来操作字母(latters)的函数,应该根据字符(characters)进行编码(encoding),以确保正确处理特定语言中所有身为字母的字符。
  • 根据POSIX和X/Open标准,c程序可使用函数setlocale来设定一个locale。改变locale会对issupper()和toupper()之类的字符分类、操作函数以及printf()之类的I/O函数产生影响。
  • 然而C的解决方案毕竟有诸多限制。由于locale是全局属性,所以同时使用一个以上的locale(例如,按英文规则读取浮点数,按照德文写出),即使不是不可能,也得费九牛二虎之力才有希望。此外locales不能扩展,如果某个必须遵守的国家协议未被c locale支持,就没有办法了。最后一点,我们根本不可能为了支持特殊文化而定义新的locales.
  • c++标准程序库利用面向对象方式解决了上述所述问题。首先,“与locale相关的细节”被封装在类型为locale的对象中。仅仅如此这般,在同一时刻运用多个locales的美梦成真。与locales相依的各种操作,将运用响应的locale对象。 例如,我们可以把每一个locale对象安装到每一个I/O stream中,或者的各成员函数便利用该对象迎合相应的规格。详见本文的(五、out.getloc、out.imbue)
  • 参考《c++标准程序库》第14章:国际化

一、locale

参见:locale,本文章主要讲解和locale相关的知识,针对facet在本文的《六、facet》只做简单介绍。

A locale is a set of features that are culture-specific, which can be used by programs to be more portable internationally.
In C++, locales are represented by an object of the locale class. Each of these locale objects contains all the information needed to use a set of culture-dependent features.
简单翻译:locales是c++中locale对象的实例。

二、设置locale (std::locale::locale)

  • c++ 11 构造函数,参见std::locale::locale

  • 构造函数,参考书籍《c++标准程序库》第14章:国际化中有中文介绍。

表达式 功能
locale() 产生一个当前全局locale的副本
locale(name) 根据名称产生一个locale
locale(loc) 产生locale loc的副本
locale(loc1,loc2,cat) 产生locale loc1的一个副本,类别cat中所有的facets将被locale loc2的facets替换
locale(loc,name,cat) 此动作等同于locale(loc1,loc2,cat)
locale(loc,fp) 产生一个locale loc的一个副本,并安装fp所指的facet将loc2赋值给loc1
loc1=loc2 loc2赋值给 loc1
loc1.templatecombine(loc2) 产生locale loc1的一个副本,并将loc2中型别为F的facet装入
  • demo
// locale::locale
#include <iostream>       // std::cout
#include <locale>         // std::locale
#include <stdexcept>      // std::runtime_errorint main()
{std::locale loc;     // initialized to locale::classic()try {loc = std::locale("en_US.UTF8");}catch (std::runtime_error) {loc = std::locale(loc, "", std::locale::ctype);}std::cout << "The selected locale is: " << loc.name() << '\n';return 0;
}

输出为

The selected locale is: en_US.UTF8

三、获取locale的名字 (std::locale::name)

-可以使用构造函数,获取程序当前的locale。而locale.name()为获取的当前locale的name.

#include <iostream>
#include <locale>int main()
{using namespace std;locale loc1;cout << loc1.name()<<endl;cout << "C++ nice! \n";cout << "C++ 很棒!\n"<<endl;system("pause");return 0;
}

程序输出为

C
C++ nice!
C++ 很棒!

四、设置全局locale(std::locale::global)

  • 设置全局的locale
#include <iostream>
#include <locale>
// 设置全局的locale
void setLoc()
{std::locale::global(std::locale("en_US"));
}int main()
{using namespace std;// 获取当前的localelocale loc1;cout << loc1.name()<<endl;cout << "C++ nice! \n";cout << "C++ 很棒!\n"<<endl;//设置全局的localesetLoc();// 获取当前localelocale loc2;cout << loc2.name() << endl;cout << "C++ nice! \n";cout << "C++ 很棒!\n";system("pause");return 0;
}

输出为

C
C++ nice!
C++ 很棒!
en_US
C++ nice!
C++ oü°?£?

五、out.getloc、out.imbue

可以使用out.imbue把locale对象安装到每一个I/O stream中,
而out.getloc获取当前的locale.

  • out.imbue
#include <iostream>       // std::cout
#include <locale>         // std::locale
using namespace std;
int main()
{cin.imbue(locale::classic());cout.imbue(locale("de_DE"));、   double value;while (cin>>value){cout << value << endl;}
}

输入cin设置locale为经典的,输出cout设置为“de_DE”。
输入浮点数:12.34
输出:12,34
德国人以逗号当做小数点。

  • cout.getloc
#include <iostream>
#include <locale>int main()
{using namespace std;locale loc1;cout << "loc1 name=" << cout.getloc().name() << endl;cout << "C++ nice! \n";cout << "C++ 很棒!\n"<<endl;//;locale loc2=std::locale("en_US");cout << "loc2 name="<<loc2.name() << endl << endl;locale loc3;cout << "loc3 name="<<cout.getloc().name() << endl;cout << "C++ nice! \n";cout << "C++ 很棒!\n";system("pause");return 0;
}

输出

loc1 name=C
C++ nice!
C++ 很棒!

loc2 name=en_US

loc3 name=C
C++ nice!
C++ 很棒!

可见:设置的不是全局的locale,对环境是没有影响的。

  • 文件流
    如果想要操作文件,用imbue设置到具体的文件流对象上更合适。如下:
#include <iostream>
#include <fstream>void WriteFile(std::wfstream& fOut)
{if (!fOut.is_open())return;fOut << L"A line English\n";fOut << L"窗前明月光\n";fOut << L"疑似地上霜\n";fOut << L"举头望明月\n";fOut << L"低头思故乡";fOut.close();
}int main()
{using namespace std;locale loc;wfstream wf_not;wf_not.open(R"(D:\locale_not.txt)", ios_base::out);WriteFile(wf_not);wfstream wf_yes;wf_yes.imbue(locale("zh_cn"));wf_yes.open(R"(D:\locale_yes.txt)", ios_base::out);WriteFile(wf_yes);system("pause");return 0;
}

行完程序后,会在L盘下生成连个文件:
打开文件,会发现locale_not里的中文没有输出:
原因很简单,wf_not没有设置locale,wf_yes设置了。

六、facet

简单说下《c++标准程序库》中的介绍。

  • 国家内部约定俗称的具体项目被划分为个数不同的面貌(axpect),分别由响应的对象处理。
  • 处理“国际化议题中的某一特定面貌”的对象,我们称为一个facet。
  • locale对象就是扮演facets的容器。
  • 想要存取locale的某个面貌,可以用响应的facet型别作为索引。
  • 简将facet当做template参数,明白传给template函数use_facet(),便可取用特定的facet。

这里就不做过多介绍了,可以简单理解为,你可以利用facet构造出独特的locale。想要更进一步了解的可以去阅读《c++标准程序库》和http://www.cplusplus.com/

参考:
1.http://www.cplusplus.com/reference/locale/
1.C++基础(十八)区域设置、locale、中文乱码、中文不输出
3.C++ 标准库的 locale 类用法

【字符集五】c++标准库<locale>相关推荐

  1. C 标准库 - locale.h

    C 标准库 - <locale.h> 简介 locale.h 头文件定义了特定地域的设置,比如日期格式和货币符号.接下来我们将介绍一些宏,以及一个重要的结构 struct lconv 和两 ...

  2. c语言标准库 菜鸟教程,C 标准库 – locale.h | 菜鸟教程

    C 标准库 - 简介 locale.h 头文件定义了特定地域的设置,比如日期格式和货币符号.接下来我们将介绍一些宏,以及一个重要的结构 struct lconv 和两个重要的函数. 库宏 下面列出了头 ...

  3. python学习笔记(十五)标准库StringIO和BytesIO

    StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写. StringIO顾名思义就是在内存中读写str. 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文 ...

  4. C 标准库 - 参考手册

    C 标准库 - 参考手册 目录 C 标准库 - 参考手册 C 标准库 math.h 简介 库宏 库函数 C 标准库 stdlib.h 简介 库变量 库宏 库函数 C 标准库 assert.h 简介 库 ...

  5. 七、标准库之<标准库>

    目录 一.C++关键字 二.标准库源代码分布 1 VC的编译器源码目录 2 GNU C++的编译器源码目录 三.Rvalue references(右值引用) 1. 左值和右值的定义 2. 为什么要引 ...

  6. C++_泛型编程与标准库(五)

    C++_泛型编程与标准库(五) 图中标红部分为自己的笔记理解 1.容器与容器之间的关系 2.深度探索list list是双向链表,从vc2019的list源码和以下图片都可以看出 template & ...

  7. [单刷APUE系列]第五章——标准I/O库

    目录 [单刷APUE系列]第一章--Unix基础知识[1] [单刷APUE系列]第一章--Unix基础知识[2] [单刷APUE系列]第二章--Unix标准及实现 [单刷APUE系列]第三章--文件I ...

  8. 零基础学Qt 4编程实例之三:勾三股四弦必五—文件包含语句与标准库的使用

    声明: <零基础学Qt4编程>中的专栏文章是qter_wd007的原创技术文章. 本系列专栏文章可随意转载,但必须保留本段声明和每一篇文章的原始地址. 作者保留版权,未经作者预先书面许可, ...

  9. C语言中最常用标准库

    标准头文件包括: <asset.h>      <ctype.h>       <errno.h>       <float.h>   <limi ...

  10. Python标准库介绍

    1. 关于Python标准库 众所周知,Python是一个依赖强大的组件库完成对应功能的语言,为了便捷实现各项功能,前辈大牛们打造了多种多样的工具库公开提供给大众使用,而越来越多的库已经因为使用的广泛 ...

最新文章

  1. EyeDropper 开发实践
  2. sql自动生成工具_可自动生成代码,5款基于AI的开发工具
  3. mysql 一分钟内_MySQL语句需要超过一分钟才能执行
  4. C++实现快速排序(附完整源码)
  5. Android 解决导入多个module时jar包冲突
  6. Flash与.NET的通信(三):LoadVars对象的应用
  7. luci L大_智慧城市大讲堂 l 大咖说5G智慧大交通
  8. DarkSide从Colonial Pipeline收取赎金的比特币地址已被找到
  9. springboot maven打包pom配置
  10. 毕业设计之 - 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测
  11. w10投影全屏设置_win10投影仪怎么铺满全屏|win10投影器全屏的设置方法
  12. 时域、频域、傅里叶变换
  13. qemuuser模式运行linux,qemu两种上网方式
  14. latex图片的子标题放在中间
  15. linux怎么恢复删除的文件
  16. android手机变微软手机号码,微软Your Phone未来将能让你用电脑远程控制拨打Android手机电话...
  17. 矩阵的基础知识回顾:矩阵乘法,矩阵的逆,伴随矩阵,矩阵的转置,行列式,相似矩阵,实对称矩阵
  18. 怎样操作微信可节省大量内存空间
  19. 微信公众平台测试号登录入口地址
  20. MATLAB矩阵生成

热门文章

  1. 浅谈路由CSRF危害,和非主流姿势
  2. 000webhost免费申请
  3. MTCNN + Deep_Sort实现多目标人脸跟踪之MTCNN人脸检测部分(一)
  4. Containerd shim 原理深入解读
  5. c语言 exec sql编程,C语言采用嵌入式方式操作数据库exec_sql.doc
  6. 日常修行中离不开观想
  7. about-page
  8. python加法_python加法运算
  9. 读书笔记《深度学习与图像识别原理与实践 大白话讲解对小白易懂》2022-8-5
  10. 通过httpurlconnection发带图片的文件