溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

linux socket亂碼如何解決

發(fā)布時(shí)間:2023-03-16 09:42:25 來(lái)源:億速云 閱讀:130 作者:iii 欄目:建站服務(wù)器

這篇文章主要講解了“l(fā)inux socket亂碼如何解決”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“l(fā)inux socket亂碼如何解決”吧!

linux socket亂碼的解決辦法:1、打開(kāi)終端命令窗口;2、利用iconv命令實(shí)現(xiàn)linux文件字符集轉(zhuǎn)換,轉(zhuǎn)換命令如“iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt > /server_test/reports/software_asserts.txt”。

問(wèn)題描述:

linux中有一個(gè)自己寫的ftp 客戶端,windows上有一個(gè)用windows自帶軟件搭的ftp服務(wù)端,當(dāng)我通過(guò)程序在服務(wù)端上創(chuàng)建含有中文的目錄或者含有中文的文件名時(shí),中文名亂碼

問(wèn)題分析:

這毫無(wú)疑問(wèn)是由于編碼問(wèn)題導(dǎo)致的,那么如何確認(rèn)應(yīng)該是哪種編碼呢?百度之后發(fā)現(xiàn),ubuntu下默認(rèn)采用utf-8,而windows默認(rèn)采用gbk,所以保證含有中文路徑的內(nèi)容發(fā)出來(lái)的時(shí)候 轉(zhuǎn)成gbk就可以了

解決方案:

utf8和gbk互轉(zhuǎn):

linux文件字符集轉(zhuǎn)換(utf8-gb2312)

一,命令行

在LINUX上進(jìn)行編碼轉(zhuǎn)換時(shí),可以利用iconv命令實(shí)現(xiàn),這是針對(duì)文件的,即將指定文件從一種編碼轉(zhuǎn)換為另一種編碼。

iconv命令用法如下:

iconv [選項(xiàng)...] [文件...]

  • 輸入/輸出格式規(guī)范:

  -f, --from-code=名稱 原始文本編碼
  -t, --to-code=名稱 輸出編碼

  • 列舉所有已知的字符集  -l, --list

  • 輸出控制:

  -c   從輸出中忽略無(wú)效的字符
  -o, --output=FILE   輸出文件
  -s, --silent   關(guān)閉警告
  --verbose   打印進(jìn)度信息

例子:

iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt > /server_test/reports/software_asserts.txt

下面需求庫(kù)文件請(qǐng)?jiān)谇度胧桨遄由厦嫦螺dlibiconv庫(kù)

二,函數(shù)運(yùn)用

1.頭文件

#include <iconv.h>

2.函數(shù)

(1) iconv_t iconv_open(const char *tocode, const char *fromcode);

此函數(shù)說(shuō)明將要進(jìn)行哪兩種編碼的轉(zhuǎn)換,tocode是目標(biāo)編碼,fromcode是原編碼,該函數(shù)返回一個(gè)轉(zhuǎn)換句柄,供以下兩個(gè)函數(shù)使用。

(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);

此函數(shù)從inbuf中讀取字符,轉(zhuǎn)換后輸出到outbuf中,inbytesleft用以記錄還未轉(zhuǎn)換的字符數(shù),outbytesleft用以記錄輸出緩沖的剩余空間。

(3) int iconv_close(iconv_t cd);

此函數(shù)用于關(guān)閉轉(zhuǎn)換句柄,釋放資源。

3.例子: 用C語(yǔ)言實(shí)現(xiàn)的轉(zhuǎn)換示例程序

#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 中國(guó)人" ;
     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;
}

這個(gè)實(shí)現(xiàn)可以跨平臺(tái),個(gè)人覺(jué)得比較好~

ps:之前做的ftp client是在windows上的,由于甲方說(shuō)要移植過(guò)去,就換到了windows上,然后就出現(xiàn)了上面的問(wèn)題,雖然對(duì)項(xiàng)目中出現(xiàn)的中文比較方案,但好歹是積累了解決問(wèn)題的經(jīng)驗(yàn)(不用中文,用拼音都行?。?/p>

感謝各位的閱讀,以上就是“l(fā)inux socket亂碼如何解決”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)linux socket亂碼如何解決這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI