0%

Linux下如何进行文件转码

mark
可以使用 file 命令,并添加 -i--mime 参数来查看一个文件的字符编码,但是这种查看编码的方式并不是准确,比如我在CentOS7.3 测试的时候它把GBK编码的文件识别成了ISO8859-1,所以最好是自己明白文件的原始编码。

使用命令行工具将使用某种字符编码的文件转化为另一种编码,在 Linux 中,命令行工具 iconv用来将使用一种编码的文本转化为另一种编码。查看iconv工具支持的编码:

1
iconv -l

这个工具使用起来很简单,比如我把原本为GBK编码的HttpServer.cpp转为UTF-8编码的HttpServer_UTF8.cpp:

1
iconv -f gbk -t utf-8 HttpServer.cpp -o HttpServer_UTF8.cpp

当然如果需要转换多个文件的时候可能就需要Shell脚本来完成咯!

如果输出编码后面添加了 //IGNORE 字符串,那些不能被转换的字符将不会被转换,并且在转换后,程序会显示一条错误信息。

如果字符串 //TRANSLIT 被添加到了上面例子中的输出编码之后 (UTF-8//TRANSLIT),待转换的字符会尽量采用形译原则。也就是说,如果某个字符在输出编码方案中不能被表示的话,它将会被替换为一个形状比较相似的字符:

1
iconv -f gbk -t utf-8//TRANSLIT HttpServer.cpp -o HttpServer_UTF8.cpp

如何在C语言中使用转码呢?下面是一个使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iconv.h>
#include <stdio.h>
#include <string.h>

int code_convert(char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
int rc;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open("UTF-8","GB2312");
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen) == -1)
return -1;
iconv_close(cd);
return 0;
}

gcc编译器默认字符集就是UTF-8,如果你不想修改源文件的编码的时候可以修改编译参数:

1
2
-finput-charset=charset 用于指定源码字符集
-fexec-charset=charset 用于指定执行字符集
  • 本文作者: Tim
  • 本文链接: https://zouchanglin.cn/2773484598.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!