0

0

linux socket 乱码怎么办

藏色散人

藏色散人

发布时间:2023-03-16 09:26:30

|

2029人浏览过

|

来源于php中文网

原创

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

linux socket 乱码怎么办

本教程操作环境: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 

 

  • 输出控制:

    Figstack
    Figstack

    一个基于 Web 的AI代码伴侣工具,可以帮助跨不同编程语言管理和解释代码。

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

相关专题

更多
C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

9

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

18

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

19

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

10

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

11

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.22

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

52

2026.01.22

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.6万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号