linux socket 乱码怎么办

发布时间 - 2023-03-16 00:00:00    点击率:
linux socket乱码的解决办法:1、打开终端命令窗口;2、利用iconv命令实现linux文件字符集转换,转换命令如“iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt > /server_test/reports/software_asserts.txt”。

本教程操作环境:linux5.9.8系统、Dell G3电脑。

linux socket 乱码怎么办?

linux,windows,socket乱码问题

问题描述:

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 

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视频教程》


# linux  # 句柄  # 服务端  # 这是  # 是在  # 两种  # 中有  # 上有  # 当我  # 请在  # 比较好 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Laravel如何实现事件和监听器?(Event & Listener实战)  免费视频制作网站,更新又快又好的免费电影网站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何用好域名打造高点击率的自主建站?  大连 网站制作,大连天途有线官网?  ,南京靠谱的征婚网站?  北京专业网站制作设计师招聘,北京白云观官方网站?  如何用wdcp快速搭建高效网站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  Android实现代码画虚线边框背景效果  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何快速查询域名建站关键信息?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  IOS倒计时设置UIButton标题title的抖动问题  网站制作免费,什么网站能看正片电影?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Python文件异常处理策略_健壮性说明【指导】  Python进程池调度策略_任务分发说明【指导】  奇安信“盘古石”团队突破 iOS 26.1 提权  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  如何用景安虚拟主机手机版绑定域名建站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  JavaScript实现Fly Bird小游戏  高防服务器租用首荐平台,企业级优惠套餐快速部署  详解Oracle修改字段类型方法总结  Python正则表达式进阶教程_复杂匹配与分组替换解析  C语言设计一个闪闪的圣诞树  如何用JavaScript实现文本编辑器_光标和选区怎么处理  如何用免费手机建站系统零基础打造专业网站?  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel如何创建自定义中间件?(Middleware代码示例)  高防服务器租用如何选择配置与防御等级?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何在IIS中新建站点并配置端口与物理路径?  Laravel如何自定义错误页面(404, 500)?(代码示例)  网站制作壁纸教程视频,电脑壁纸网站?  JavaScript如何实现倒计时_时间函数如何精确控制  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  如何快速搭建安全的FTP站点?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  PHP正则匹配日期和时间(时间戳转换)的实例代码  JavaScript模板引擎Template.js使用详解  如何获取免费开源的自助建站系统源码?