linux下如何转换文本的字符编码
linux提供了将文本从一个字符集编码转换成另一种字符集编码的相关命令和函数。
查看系统的编码方式与修改
locale
命令可以查看系统当前的编码方式。如LANG=en_US.UTF-8
.代表语言是en_US(美式英语),编码是UTF-8。- 可以通过修改
/etc/sysconfig/i18n
文件中的具体段修改编码方式。
字符编码转换命令
iconv
- 描述:将文本从一个字符集编码转换成另一种字符集编码。(如将utf-8格式的文本转换成gb2312格式)。
- 语法:
iconv [options] [-f from-encoding] [-t to-encoding] [inputfile]...
- 选项:
- -f:输入文本的编码格式。如
GB2312
. - -t:输出文本的编码格式。如
utf-8
.如果后缀//IGNORE
(如utf-8//IGNORE
),遇到识别不了的字符则停止转换并退出。如果后缀//TRANSLIT
,遇到识别不了的字符,使用相近的代替或者?
代替. - -l:打印所有可传化的字符集。
- -o:设置输出文件的名称。
- -c:当遇到无法转换的字符时,应该默默地丢弃它们,而不是终止它们.
- -f:输入文本的编码格式。如
- eg:
iconv -f "utf-8" -t "GB2312" xxx.txt -o xxxGB2312.txt
用户空间字符编码转换相关函数
-
包含头文件:
#include <iconv.h>
-
iconv_t iconv_open(const char *tocode, const char *fromcode)
- 描述:为字符集编码转换分配一个描述符。
tocode
:转换后文本的编码格式.具体格式可用iconv --list
命令查看。如果后缀//IGNORE
(如utf-8//IGNORE
),遇到识别不了的字符则直接丢弃。如果后缀//TRANSLIT
,遇到识别不了的字符,使用相近的代替或者?
代替.fromcode
:当前文本的编码格式.- return:出错:-1.正确:返回描述符。
-
int iconv_close(iconv_t cd)
- 描述:销毁为字符集编码转换分配的描述符。
cd
:要销毁的描述符.
-
size_t iconv(iconv_t cd,char **inbuf, size_t *inbytesleft,char **outbuf, size_t *outbytesleft)
- 描述:将文本从一个字符集编码转换成另一种字符集编码。(如将utf-8格式的文本转换成gb2312格式)。
cd
: 由iconv_open()
函数返回的转化描述符。inbuf
:指向需要转换的字符串首地址的指针变量地址。inbytesleft
:字符串中未转换的字节数的变量地址。iconv()
在转换过程中会修改此变量的内容值。当转换完成时,此变量的值变为0.outbuf
:指向输出缓冲区首地址的指针变量地址。outbytesleft
: 指向outbuf剩余空间大小的变量地址。- return:
- 失败:-1。使用errno查看具体错误值。
- 成功,返回调用期间执行的不可逆转换的数量。可逆转换不计算在内。
使用例程如下:
#include<stdio.h>
#include <iconv.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
void main(void)
{
char inBuff[] = "2020武汉加油";
size_t inBuffLen = strlen(inBuff);
//由于iconv()会改变传入参数的值,所以创建临时变量fromLen、*pIn存放。
size_t fromLen = inBuffLen;
char *pIn = inBuff;
//存放转化结果
const size_t outBuffLen = 32;
char outBuff[outBuffLen];
//由于iconv()会改变传入参数的值,所以创建临时变量fromLen、*pIn存放。
size_t toLen = outBuffLen;
char *pOut = outBuff;
printf("fromLen:%lu toLen:%lu\n",fromLen,toLen);
printf("utf-8编码: ");
for(int i = 0; i < inBuffLen; i++){
printf("%02X ",(uint8_t)inBuff[i]);
}
iconv_t icd = iconv_open("GB2312","UTF-8");
if ((iconv_t)-1 == icd){
printf("open error");
return;
}
size_t tempLen = iconv(icd,&pIn,&fromLen,&pOut,&toLen);
if (tempLen == -1){
printf("iconv error");
return;
}
printf("\ngb2312编码:");
//这个长度是转换结果的长度
size_t temp2len = outBuffLen - toLen;
for(int i = 0; i < temp2len; i++){
printf("%02X ",(uint8_t)outBuff[i]);
}
printf("\n");
iconv_close(icd);
}
关于技术交流
此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。