IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【字符集五】c++标准库<locale> -> 正文阅读

[C++知识库]【字符集五】c++标准库<locale>


上篇主要讲解了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=loc2loc2赋值给 loc1
loc1.templatecombine(loc2)产生locale loc1的一个副本,并将loc2中型别为F的facet装入
  • demo
// locale::locale
#include <iostream>       // std::cout
#include <locale>         // std::locale
#include <stdexcept>      // std::runtime_error

int 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;
    // 获取当前的locale
	locale loc1;
	cout << loc1.name()<<endl;
	cout << "C++ nice! \n";
	cout << "C++ 很棒!\n"<<endl;
    
    //设置全局的locale
	setLoc();

    // 获取当前locale
	locale 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++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 17:55:54  更:2022-05-24 17:56:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:31:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码