使用iconv的包装类CharsetConverter进行编码转换的示例
GitHub地址https://github.com/BuYishi/charset_converter_test
charset_converter_test.cpp
#include <iostream>
#include <fstream>
#include "CharsetConverter.h"
int main()
{
std::string filename("text_utf-8.txt");
std::ifstream ifs(filename, std::ifstream::in);
if (ifs)
{
std::string line, utf8Text;
while (std::getline(ifs, line))
utf8Text.append(line + "\n");
try
{
const std::string &converted = CharsetConverter("GBK", "UTF-8").convert(utf8Text);
std::cout << converted << std::endl;
filename = "text_gbk.txt";
std::ofstream ofs(filename, std::ofstream::out);
if (ofs)
{
ofs.write(converted.c_str(), converted.length());
}
else
std::cerr << "Cannot open file: " << filename << std::endl;
}
catch (const std::string &ex)
{
std::cerr << ex << std::endl;
}
}
else
std::cerr << "Cannot open file: " << filename << std::endl;
std::system("pause");
return ;
}
CharsetConverter.h
#pragma once
#include <iconv/iconv.h>
#include <string>
class CharsetConverter
{
public:
CharsetConverter(const char *toCode, const char *fromCode);
~CharsetConverter();
std::string convert(const std::string &source) const;
private:
iconv_t conversionDescriptor;
};
CharsetConverter.cpp
#include "CharsetConverter.h"
CharsetConverter::CharsetConverter(const char *toCode, const char *fromCode)
{
conversionDescriptor = iconv_open(toCode, fromCode);
if (reinterpret_cast<iconv_t>(-) == conversionDescriptor)
{
if (errno == EINVAL)
throw std::string("Not supported from " + std::string(fromCode) + " to " + toCode);
else
throw std::string("Unknown error");
}
}
CharsetConverter::~CharsetConverter()
{
iconv_close(conversionDescriptor);
}
std::string CharsetConverter::convert(const std::string &source) const
{
const char *sourcePtr = source.c_str();
size_t sourceByteCount = source.length(), totalSpaceOfDestinationBuffer = sourceByteCount * , availableSpaceOfDestinationBuffer = totalSpaceOfDestinationBuffer;
char *destinationBuffer = new char[totalSpaceOfDestinationBuffer], *destinationPtr = destinationBuffer;
std::string converted;
size_t convertedCharCount;
while (sourceByteCount > )
{
size_t ret = iconv(conversionDescriptor, &sourcePtr, &sourceByteCount, &destinationPtr, &availableSpaceOfDestinationBuffer);
if (static_cast<size_t>(-) == ret)
{
++sourcePtr;
--sourceByteCount;
}
convertedCharCount = totalSpaceOfDestinationBuffer - availableSpaceOfDestinationBuffer;
}
converted.append(destinationBuffer, convertedCharCount);
delete[] destinationBuffer;
return converted;
}
使用iconv的包装类CharsetConverter进行编码转换的示例的更多相关文章
- 【Linux基础】iconv命令详解(编码转换)
对于给定文件把它的内容从一种编码转换成另一种编码. iconv -f GBK -t UTF- file1 -o file2 //将GBK转换为UTF8,输出到file2.没-o那么会输出到标准输出 i ...
- PHP iconv 解决utf-8和gb2312编码转换问题
就一个很简单的函数iconv();但是就是这个函数在网上找了很多例子,都无法成功转换,这是为什么呢? 终于皇天不负有心人,答案还是让我找到了. 网上的都是这样用的 <?php $co ...
- iconv 解决utf-8和gb2312编码转换问题
$content = iconv("utf-8","gb2312//IGNORE",$content); //utf-8转gbk $content = icon ...
- 在C语言中使用libiconv进行编码转换的示例
libiconv_sample.c #include <stdio.h> #include <malloc.h> #include "libiconv/iconv.h ...
- iconv字符编码转换
转自 http://blog.csdn.net/langresser_king/article/details/7459367 iconv(http://www.gnu.org/software/li ...
- (转)PHP下编码转换函数mb_convert_encoding与iconv的使用说明
之--http://www.jb51.net/article/21451.htm mb_convert_encoding这个函数是用来转换编码的.原来一直对程序编码这一概念不理解,不过现在好像有点开窍 ...
- PHP下编码转换函数mb_convert_encoding与iconv的使用说明
mb_convert_encoding这个函数是用来转换编码的. 不过英文一般不会存在编码问题,只有中文数据才会有这个问题.比如你用Zend Studio或Editplus写程序时,用的是gbk编码, ...
- PHP iconv()编码转换函数用法示例
PHP iconv()字符编码转换函数的用法,iconv()函数,在php5中是内置的,语法格式:iconv("UTF- 8","GB2312//IGNORE" ...
- php 字符编码转换函数 iconv mb_convert_encoding比较
在使用PHP处理字符串时,我们经常会碰到字符编码转换的问题,你碰到过iconv转换失败吗? 发现问题时,网上搜了搜,才发现iconv原来有bug ,碰到一些生僻字就会无法转换,当然了配置第二个参数时, ...
随机推荐
- 解开Future的神秘面纱之任务执行
此文承接之前的博文 解开Future的神秘面纱之取消任务 补充一些任务执行的一些细节,并从全局介绍程序的运行情况. 任务提交到执行的流程 前文我们已经了解到一些Future的实现细节,这里我们来梳理一 ...
- haskell 乱搞(2)之 Y-conbinator [原创]
Y-conbinator"有没有用"?并没有,在大多数支持函数式编程的语言里,你可以自由的使用递归,而这货只是作为理论基石弥散在函数式编程的血肉之中 这是数学笔记,这是数学笔记,这 ...
- BZOJ 1821 [JSOI2010]Group 部落划分:MST
Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...
- P1168 中位数 (优先队列,巧解)
题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1,3,5,……个数的中位数. 输入 ...
- nmon性能分析工具(生成图表)
1. nmon性能结果生成报告工具下载地址: https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power% ...
- Python 可变对象与不可变对象
1. 不可变(immutable):int.字符串(string).float.(数值型number).元组(tuple) 可变(mutable):字典型(dictionary).列表型(list) ...
- 基于CI框架的管理系统
1:ci框架是有入口文件的,前端和后台入口文件(index.php,admin.php):里面修改$application_folder = 'application/home': 2:项目基本都是在 ...
- 《从零开始搭建游戏服务器》MySQL安装配置
一.下载资源: 到MySQL官网下载免安装版的mysql包,或者直接点击此链接下载:mysql-5.7.19-winx64.zip 二.解压配置: 将上面下载的安装包解压到一个本地目录下,在得到的my ...
- HDOJ 5213
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5213 BC 上的题,题解很清楚,会莫对的应该不难, 对于一个询问,我们拆成四个询问,开始拆成求区间矩形 ...
- 济南day1
预计分数:100+100+30 实际分数:10+60+20 T1立方数(cubic) 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8, ...