博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用iconv的包装类CharsetConverter进行编码转换的示例
阅读量:6416 次
发布时间:2019-06-23

本文共 2868 字,大约阅读时间需要 9 分钟。

GitHub地址

charset_converter_test.cpp

#include 
#include
#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 0;}

CharsetConverter.h

#pragma once#include 
#include
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
(-1) == 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 * 2, availableSpaceOfDestinationBuffer = totalSpaceOfDestinationBuffer; char *destinationBuffer = new char[totalSpaceOfDestinationBuffer], *destinationPtr = destinationBuffer; std::string converted; size_t convertedCharCount; while (sourceByteCount > 0) { size_t ret = iconv(conversionDescriptor, &sourcePtr, &sourceByteCount, &destinationPtr, &availableSpaceOfDestinationBuffer); if (static_cast
(-1) == ret) { ++sourcePtr; --sourceByteCount; } convertedCharCount = totalSpaceOfDestinationBuffer - availableSpaceOfDestinationBuffer; } converted.append(destinationBuffer, convertedCharCount); delete[] destinationBuffer; return converted;}

 

转载于:https://www.cnblogs.com/buyishi/p/9373906.html

你可能感兴趣的文章
java多线程系列5-死锁与线程间通信
查看>>
数据库分库分表
查看>>
腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...
查看>>
小程序模板嵌套以及相关遍历数据绑定
查看>>
Systemd入门教程:命令篇(转)
查看>>
java随机范围内的日期
查看>>
spring事务学习(转账案例)(二)
查看>>
[官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
查看>>
http协议与http代理
查看>>
【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例...
查看>>
Redis+Spring缓存实例
查看>>
Storm集群安装详解
查看>>
centos7.x搭建svn server
查看>>
原码编译安装openssh6.7p1
查看>>
项目实战:自定义监控项--监控CPU信息
查看>>
easyui-datetimebox设置默认时分秒00:00:00
查看>>
蚂蚁分类信息系统5.8多城市UTF8开源优化版
查看>>
在django1.2+python2.7环境中使用send_mail发送邮件
查看>>
“Metro”,移动设备视觉语言的新新人类
查看>>
PHP源代码下载(本代码供初学者使用)
查看>>