使用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 ,碰到一些生僻字就会无法转换,当然了配置第二个参数时, ...
随机推荐
- [BZOJ2287]【POJ Challenge】消失之物(DP)
传送门 f[i][j]表示前i个物品,容量为j的方案数c[i][j]表示不选第i个物品,容量为j的方案数两个数组都可以压缩到一维 那么f[i][j] = f[i - 1][j] + f[i - 1][ ...
- [BZOJ1589] [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果(tarjan缩点 + 记忆化搜索)
传送门 先用tarjan缩点,再记忆话搜索一下 #include <stack> #include <cstdio> #include <cstring> #inc ...
- 【二叉树】hdu 1622 Trees on the level
[题意] 给定一棵树每个结点的权重和路径(路径用LR串表示),输出这棵树的层次遍历 [思路] 注意输入输出,sscanf用来格式化地截取需要的数据,strchr来在字符串中查找字符的位置 [Accep ...
- 转载: LINK : fatal error LNK1104: 无法打开文件“mfc71.lib”的原因又一例
转载地址:http://blog.csdn.net/mxclxp/article/details/8196142 LINK : fatal error LNK1104: 无法打开文件“mfc71.li ...
- bzoj 1818 Cqoi2010 内部白点 扫描线
[Cqoi2010]内部白点 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1126 Solved: 530[Submit][Status][Disc ...
- VirtualBox 下主机与虚拟机以及虚拟机之间互通信配置
引用链接:1)http://www.it165.net/os/html/201401/7063.html 2)http://www.cnblogs.com/sineatos/p/4489620.htm ...
- intellij idea 和 myeclipse 转换
原文出处:http://chinaxxren.iteye.com/blog/893970 当只用 intellij idea 建立 工程 1.首先是new project--->create p ...
- 每日记录 2016-4-29 HTML5本地存储
HTML5本地存储 一.HTML5 localStorage 在HTML5中,本地存储是一个window的属性,包括localStorage和 sessionStorage,从名字应该可以很清楚的辨认 ...
- codevs——2693 上学路线(施工)
2693 上学路线(施工) 时间限制: 2 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 问题描述 你所在的城市街道好像一个 ...
- MMT事务处理来源类型-INV_OBJECT_GENEALOGY.GETSOURCE
INV_OBJECT_GENEALOGY.GETSOURCE (MTL_MATERIAL_TRANSACTIONS.ORGANIZATION_ID, ...