linux下文件编码格式转换方法(gb18030utf-8)

linux下文件编码格式转换方法(gb18030utf-8),第1张

linux下文件编码格式转换方法(gb18030/utf-8) 在 Linux 做开发或者系统管理遇到乱码是经常的事情,主要windows下中文的默认编码是bg2312,而 linux下是utf-8。很多时候 涉及到和windows平台系统的通信免不了编码的转化,可能大部分人都用iconv库函数(包含在glib中)和iconv命令来执行编码转换,即: iconv -f gb18030 -t utf-8 file1.txt -o file2.txt 说实话这个命令不好使,一方面容易重复转换,另一方面不支持通配符,无法成批转 换,文件少了还好说,要是一大堆文件岂不是要累死? 今天我要推荐的是另一个 Shell 下编码转换工具enca。用它不仅可以转换编码,还可以查看文件的原始编码,而且还支持成批转换。使用上也比iconv方便一些。安装enca很简单,一般用源安装就行了,enca用法如下: enca -L 当前语言 文件名 enca -L zh_CN file //检查文件的编码 enca -L 当前语言 -x 目标编码 文件名 enca -L zh_CN -x UTF-8 file //将文件编码转换为”UTF-8″编码 enca -L zh_CN -x UTF-8 <file1 >file2 //如果不想覆盖原文件可以这样 除了有检查文件编码的功能以外,”enca”还有一个好处就是如果文件本来就是你要转换的那种编码,它不会报错,还是会print出结果来, 而”iconv”则会报错。这对于脚本编写是比较方便的事情。

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

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8949555.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-23
下一篇2023-04-23

发表评论

登录后才能评论

评论列表(0条)

    保存