问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在Linux系统实现字符编码转换

发布网友 发布时间:2022-04-22 05:35

我来回答

1个回答

热心网友 时间:2022-04-13 03:41

好Linux下提供了iconv实现这一功能,在Linux 的 shell 环境下,iconv用法如下:
iconv -f fromconde -t tocode
-f: 指定需要转换的文本编码
-t: 指定目标文本编码

我们也可以用 -l 列举出所有已知的字符编码集合

iconv -l

具体用法可以通过帮助函数 iconv --help来详细了解

另外,我们也可以在程序中直接使用该函数实现文本的编码转换

#ifndef __CODE_CONVERTER
#define __CODE_CONVERTER
#ifdef WIN32
#include <windows.h>
#else
#include <iconv.h>
#endif
class CodeConverter
{
private:
#ifndef WIN32
iconv_t m_cd;
#endif
const char* m_pszFromCode;
const char* m_pszToCode;
public:
CodeConverter()
{
m_pszFromCode = NULL;
m_pszToCode = NULL;
#ifndef WIN32
m_cd = 0;
#endif
}
~CodeConverter()
{
#ifndef WIN32
iconv_close(m_cd);
#endif
}
bool Initialize(const char *pszToCode, const char *pszFromCode);
size_t Convert(char* inBuf, size_t inBytesLeft, char* outBuf, size_t outBytesLen);
};
#endif

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "code_converter.h"
#include <errno.h>
bool CodeConverter::Initialize(const char* pszToCode, const char* pszFromCode)
{
if(pszFromCode == NULL || pszToCode == NULL) return false;
m_pszFromCode = pszFromCode;
m_pszToCode = pszToCode;
#ifndef WIN32
m_cd = iconv_open(m_pszToCode,m_pszFromCode);
if(m_cd == (iconv_t)-1)
{
printf("cannot open iconv descripter\n");
return false;
}
#endif
return true;
}
size_t CodeConverter:: Convert(char* inBuf, size_t inBytesLeft, char* outBuf, size_t outBytesLen)
{
int nRealLen = 0;
#ifdef WIN32
if(stricmp(m_pszFromCode,"UNICODE") == 0)
{
nRealLen = WideCharToMultiByte(CP_ACP,0,(PWCHAR)inBuf, inBytesLeft, (PCHAR)outBuf, outBytesLen,NULL,NULL);
}
if(stricmp(m_pszFromCode,"gb2312") == 0)
{
nRealLen = MultiByteToWideChar(CP_ACP,0,(PCHAR)inBuf,inBytesLeft,(PWCHAR)outBuf, outBytesLen);
}
#else
size_t outBytesLeft = outBytesLen;
size_t ret = 0;
while (1)
{
ret = iconv(m_cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft);
if (ret == 0) break;
if (ret == (size_t)-1)
{
printf("iconv error aaa: %s\n",strerror(errno));
return -1;
}
inBuf++; inBytesLeft--;
}
nRealLen = outBytesLen-outBytesLeft;
outBuf[nRealLen]=0;
#endif
return nRealLen;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 绍兴诺业防腐材料有限公司怎么样? 绍兴本地哪里有移动升降平台的厂家,可以去现场看产品 浙江绍兴有出租电动吊篮的吗 linux怎么设置mysql 的编码格式 绍兴出租车起步价是多少?然后每公里是怎么计费的啊? 绍兴升降货梯厂家 绍兴哪有卖车间载货货梯的厂家 绍兴哪里有移动脚手架出租(包括市区袍江柯桥及滨海) linux怎么修改默认编码 如何批量修改linux 文件编码格式 linux 怎么修改数据库编码格式 linux转换文件编码格式 哪位大佬有2016版塞斯·罗根主演的《香肠派对 Sausa... 香肠派对max成就怎么得 4g流量打香肠派对一天要耗多少钱 谁有香肠派对的百度云,不要解压的 形容非常准确,一点都不差的成语? 什么什么不差 长的不差是什么意思 表达不差的成语 vivoy93s玩香肠派对卡不卡? 绍兴有几个出租车公司,分别是那几个有谁知道名字吗 绍兴豪鼎液压机械有限公司怎么样? linux vim如何临时改变文件的编码方式 绍兴八斗汽车租赁有限公司怎么样? 绍兴确诊的哥曾多天连续工作20小时,他的流调轨迹... 绍兴市水乡旅游汽车出租有限公司怎么样? 浙江省绍兴市的出租车公司的电话? 绍兴越城区哪有便宜房子出租? 绍兴房子出租上那个网站 绍兴那里有房子出租? 绍兴市个人出租房屋税收税率 绍兴城东附近,有没有便宜点的房子出租啊的 我有一套绍兴的房子要出租,要怎么把它挂到网上去... 80华严,60华严和40华严有什么不同,有什么区别佛教? 《华严经》讲的是什么内容? 华严三圣。这个“华严”是什么意思? 钩针购一件薄开衫,用什么线勾比较好? 时尚毛衣外套编织方面的书籍 求搭配达人指点、这样的衬衫搭配什么穿起来比较好... 钩花稚公主裙什麽时候加针换钩针