共计 3096 个字符,预计需要花费 8 分钟才能阅读完成。
这篇文章主要讲解了“linux socket 乱码如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“linux socket 乱码如何解决”吧!
linux socket 乱码的解决办法:1、打开终端命令窗口;2、利用 iconv 命令实现 linux 文件字符集转换,转换命令如“iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt /server_test/reports/software_asserts.txt”。
问题描述:
linux 中有一个自己写的 ftp 客户端,windows 上有一个用 windows 自带软件搭的 ftp 服务端,当我通过程序在服务端上创建含有中文的目录或者含有中文的文件名时,中文名乱码
问题分析:
这毫无疑问是由于编码问题导致的,那么如何确认应该是哪种编码呢?百度之后发现,ubuntu 下默认采用 utf-8,而 windows 默认采用 gbk,所以保证含有中文路径的内容发出来的时候 转成 gbk 就可以了
解决方案:
utf8 和 gbk 互转:
linux 文件字符集转换 (utf8-gb2312)
一,命令行
在 LINUX 上进行编码转换时, 可以利用 iconv 命令实现, 这是针对文件的, 即将指定文件从一种编码转换为另一种编码。
iconv 命令用法如下:
iconv [选项...] [文件...]
输入 / 输出格式规范:
-f, --from-code= 名称 原始文本编码
-t, --to-code= 名称 输出编码
列举所有已知的字符集 -l, –list
输出控制:
-c 从输出中忽略无效的字符
-o, --output=FILE 输出文件
-s, --silent 关闭警告
--verbose 打印进度信息
例子:
iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt /server_test/reports/software_asserts.txt
下面需求库文件请在嵌入式板子上面下载 libiconv 库
二,函数运用
1. 头文件
#include iconv.h
2. 函数
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
此函数说明将要进行哪两种编码的转换,tocode 是目标编码,fromcode 是原编码, 该函数返回一个转换句柄, 供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函数从 inbuf 中读取字符, 转换后输出到 outbuf 中,inbytesleft 用以记录还未转换的字符数,outbytesleft 用以记录输出缓冲的剩余空间。
(3) int iconv_close(iconv_t cd);
此函数用于关闭转换句柄, 释放资源。
3. 例子: 用 C 语言实现的转换示例程序
#include stdio.h
#include string.h
#include iconv.h
#include stdlib.h
static int charset_convert( const char *from_charset, const char *to_charset,
char *in_buf, size_t in_left, char *out_buf, size_t out_left)
iconv_t icd = (iconv_t)-1;
size_t sRet = -1;
char *pIn = in_buf;
char *pOut = out_buf;
size_t outLen = out_left;
if (NULL == from_charset || NULL == to_charset || NULL == in_buf || 0 = in_left || NULL == out_buf || 0 = out_left)
{
return -1;
}
icd = iconv_open(to_charset, from_charset);
if ((iconv_t)-1 == icd)
{
return -1;
}
sRet = iconv(icd, pIn, in_left, pOut, out_left);
if (( size_t )-1 == sRet)
{ iconv_close(icd);
return -1;
}
out_buf[outLen - out_left] = 0;
iconv_close(icd);
return ( int )(outLen - out_left);
static int charset_convert_UTF8_TO_GB2312( char *in_buf, size_t in_left, char *out_buf, size_t out_left)
return charset_convert( UTF-8 , GB2312 , in_buf, in_left, out_buf, out_left);
static int charset_convert_GB2312_TO_UTF8( char *in_buf, size_t in_left, char *out_buf, size_t out_left)
return charset_convert( GB2312-8 , UTF-8 , in_buf, in_left, out_buf, out_left);
int main()
char *pIn = hello 中国人 ;
char *pOut = NULL;
size_t outLen = 0;
size_t inLen = 0;
int iRet = -1;
inLen = strlen (pIn);
outLen = inLen * 3;
pOut = ( char *) malloc ( sizeof ( char ) * outLen);
if (NULL == pOut)
{
return -1;
}
memset (pOut, 0, sizeof ( char ) * outLen);
iRet = charset_convert_UTF8_TO_GB2312(pIn, ( size_t )inLen, pOut, ( size_t )inLen);
if (-1 == iRet)
{
return -1;
}
printf ( out = %s;\touLen = %d\n , pOut, iRet);
free (pOut);
pOut = NULL;
return 0;
}
这个实现可以跨平台,个人觉得比较好~
ps:之前做的 ftp client 是在 windows 上的,由于甲方说要移植过去,就换到了 windows 上,然后就出现了上面的问题,虽然对项目中出现的中文比较方案,但好歹是积累了解决问题的经验(不用中文,用拼音都行啊)
感谢各位的阅读,以上就是“linux socket 乱码如何解决”的内容了,经过本文的学习后,相信大家对 linux socket 乱码如何解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!