首頁 > 運維 > linux運維 > 主體

linux socket 亂碼怎麼辦

藏色散人
發布: 2023-03-16 09:26:30
原創
1826 人瀏覽過

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 

    #輸出控制:
  •   -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影片教學

以上是linux socket 亂碼怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板