linux socket 亂碼怎么辦

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

linux socket 亂碼怎么辦

本教程操作環(huán)境:linux5.9.8系統(tǒng)、Dell G3電腦。

linux socket 亂碼怎么辦?

linux,windows,socket亂碼問題

問題描述:

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

問題分析:

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

解決方案:

utf8和gbk互轉(zhuǎn):

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

一,命令行

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

iconv命令用法如下:

iconv?[選項...]?[文件...]
  • 輸入/輸出格式規(guī)范:

  -f,?--from-code=名稱?原始文本編碼   -t,?--to-code=名稱?輸出編碼
  • 列舉所有已知的字符集  -l, –list?

?

  • 輸出控制:

  -c?  從輸出中忽略無效的字符   -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

下面需求庫文件請在嵌入式板子上面下載libiconv庫

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

1.頭文件

#include?<iconv.h></iconv.h>

2.函數(shù)

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

此函數(shù)說明將要進(jìn)行哪兩種編碼的轉(zhuǎn)換,tocode是目標(biāo)編碼,fromcode是原編碼,該函數(shù)返回一個轉(zhuǎn)換句柄,供以下兩個函數(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語言實現(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?&gt;=?in_left?||?NULL?==?out_buf?||?0?&gt;=?out_left) ?????{ ?????????return??-1; ?????} ? ?????icd?=?iconv_open(to_charset,?from_charset); ?????if??((iconv_t)-1?==?icd) ?????{ ?????????return??-1; ?????} ? ?????sRet?=?iconv(icd,?&amp;pIn,?&amp;in_left,?&amp;pOut,?&amp;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?=?%dn"?,?pOut,?iRet); ?????free?(pOut); ?????pOut?=?NULL; ?????return??0; }

這個實現(xiàn)可以跨平臺,個人覺得比較好~

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

相關(guān)推薦:《Linux視頻教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊11 分享