使用c++11标准库转换字符编码

转自:http://www.cnblogs.com/LinuxHunter/archive/2013/01/06/2848293.html

#include <stdio.h>
#include <locale>
#include <codecvt>

const std::string ws2s( const std::wstring& src )
{
	std::locale sys_locale("");

	const wchar_t* data_from = src.c_str();
	const wchar_t* data_from_end = src.c_str() + src.size();
	const wchar_t* data_from_next = 0;

	int wchar_size = 4;
	char* data_to = new char[(src.size() + 1) * wchar_size];
	char* data_to_end = data_to + (src.size() + 1) * wchar_size;
	char* data_to_next = 0;

	memset( data_to, 0, (src.size() + 1) * wchar_size );

	typedef std::codecvt<wchar_t, char, mbstate_t> convert_facet;
	mbstate_t out_state = 0;
	auto result = std::use_facet<convert_facet>(sys_locale).out(
		out_state, data_from, data_from_end, data_from_next,
		data_to, data_to_end, data_to_next );
	if( result == convert_facet::ok )
	{
		std::string dst = data_to;
		delete[] data_to;
		return dst;
	}
	else
	{
		printf( "convert error!\n" );
		delete[] data_to;
		return std::string("");
	}
}

const std::wstring s2ws( const std::string& src )
{
	std::locale sys_locale("");

	const char* data_from = src.c_str();
	const char* data_from_end = src.c_str() + src.size();
	const char* data_from_next = 0;

	wchar_t* data_to = new wchar_t[src.size() + 1];
	wchar_t* data_to_end = data_to + src.size() + 1;
	wchar_t* data_to_next = 0;

	wmemset( data_to, 0, src.size() + 1 );

	typedef std::codecvt<wchar_t, char, mbstate_t> convert_facet;
	mbstate_t in_state = 0;
	auto result = std::use_facet<convert_facet>(sys_locale).in(
		in_state, data_from, data_from_end, data_from_next,
		data_to, data_to_end, data_to_next );
	if( result == convert_facet::ok )
	{
		std::wstring dst = data_to;
		delete[] data_to;
		return dst;
	}
	else
	{
		printf( "convert error!\n" );
		delete[] data_to;
		return std::wstring(L"");
	}
}

const std::string ws2utf8( const std::wstring& src )
{
	std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
	return conv.to_bytes( src );
}

const std::wstring utf8_2_ws( const std::string& src )
{
	std::wstring_convert<std::codecvt_utf8<wchar_t> > conv;
	return conv.from_bytes( src );
}遇到0X2C 0XA0的UTF8字符编码进行特殊处理,转换成普通空格。

使用c++11标准库转换字符编码

时间: 2024-09-30 19:08:03

使用c++11标准库转换字符编码的相关文章

python标准库之字符编码详解

codesc官方地址:https://docs.python.org/2/library/codecs.html 相关帮助:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html #python标准库(英文地址:)http://www.ask3.cn/ebook/docspy3zh/library/index.html unicode入门: cpython2.xz支持2种类型字符串处理文本数据,老式的str实例使用单个8位字节表示字

Ubuntu下C++使用icu库检测字符编码

Ubuntu下C++使用icu库检测字符编码.需先安装libicu-dev库: sudo apt install libicu-dev C++代码如下: //g++ -o x x.cpp -licuuc -licui18n #include <stdio.h> #include <string.h> #include <unicode/ucnv.h> #include <unicode/utypes.h> #include <unicode/ucsde

C++11标准库中cstdio头文件新增的5个格式化I/O函数学习

刚开始学网络编程,稍微扩展书上的简单C/S程序时,发现以前太忽略标准I/O这一块,查官网发现C++11新增了几个格式化I/O函数. snprintf    将格式化输出写入到有大小限制的缓存中 vfscanf     从流中读取数据到可变参数列表中 vscanf      读取格式化数据到可变参数列表中 vsnprintf  从可变参数列表中写入数据到有大小限制的缓存中 vsscanf     从字符串中读取格式化数据到可变参数列表中 主要谈谈snprintf,后面4个都是辅助可变参数列表的.

C++标准库处理字符流时getline的一个坑

一.描述 如果字符流最后没有一个空白行,那么getline处理最后一行的数据时,seekg会失效 二.代码测试 #include <sstream> #include <iostream> using namespace std; int main(int argc, char** argv) { const char* cs = "line1\nline2\nline3"; stringstream ss(cs); for (int i = 0; i <

php字符编码转换之gb2312转为utf8(转)

在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦.string iconv ( string in_charset, string out_charset, string str ) 注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符

C++11标准教程

C++11,先前被称作C++0x,即ISO/IEC 14882:2011,是目前的C++编程语言的正式标准.它取代第二版标准ISO/IEC 14882:2003(第一版ISO/IEC 14882:1998公开于1998年,第二版于2003年更新,分别通称C++98以及C++03,两者差异很小).新的标准包含核心语言的新机能,而且扩展C++标准程序库,并入了大部分的C++ Technical Report 1程序库(数学的特殊函数除外).最新的消息被公开在 ISO C++ 委员会网站(英文). I

刨根究底字符编码之八——Unicode编码方案概述

Unicode编码方案概述 1. 前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案.这样一来同一个二进制编码就有可能被解释成不同的字符,导致不同的字符集在交换数据时带来极大的不便. 比如大陆和台湾是只相隔150海里.使用着同一种语言的兄弟地区,也分别采用了不同的DBCS双字节字符集编码方案. 以前大陆地区必须装上类似于"UCDOS希望汉字系统"这样的中文处理系统专门来处理简体汉字的显示.输入问题. 而台湾地区由于采用

第十二课时之标准库浏览II

11.标准库浏览II 11.1输出格式 reprlib 模块为大型的或深度嵌套的容器缩写显示提供了 :repr() 函数的一个定制版本: >>> import reprlib >>> reprlib.repr(set('supercalifragilisticexpialidocious')) "set(['a', 'c', 'd', 'e', 'f', 'g', ...])" pprint 模块给老手提供了一种解释器可读的方式深入控制内置和用户自定

Learing-Python【8】:Python字符编码

1.内存和硬盘都是用来存储的 内存:速度快 硬盘:永久保存 2.文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就可以启动一个进程,是在内存中的,所以在编辑器编写的内容也都是存放在内存中的,断电后数据就丢失了.因而需要保存在硬盘上,点击保存按钮或快捷键,就把内存中的数据保存到了硬盘上.在这一点上,我们编写的py文件(没有执行时),跟编写的其他文件没有什么区别,都只是编写一堆字符而已. 3.Python解释器执行py文件的原理,例如 python test.py