linux socket 亂碼怎麼辦

2023-03-16 10:00:44

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 <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 亂碼怎麼辦的詳細內容,更多請關注TW511.COM其它相關文章!